aboutsummaryrefslogtreecommitdiffstats
path: root/pysite/apps/api/migrations
diff options
context:
space:
mode:
Diffstat (limited to 'pysite/apps/api/migrations')
-rw-r--r--pysite/apps/api/migrations/0001_initial.py21
-rw-r--r--pysite/apps/api/migrations/0002_documentationlink.py21
-rw-r--r--pysite/apps/api/migrations/0003_offtopicchannelname.py20
-rw-r--r--pysite/apps/api/migrations/0004_role.py23
-rw-r--r--pysite/apps/api/migrations/0005_user.py38
-rw-r--r--pysite/apps/api/migrations/0006_add_help_texts.py44
-rw-r--r--pysite/apps/api/migrations/0007_tag.py23
-rw-r--r--pysite/apps/api/migrations/0008_tag_embed_validator.py23
-rw-r--r--pysite/apps/api/migrations/0009_snakefact.py21
-rw-r--r--pysite/apps/api/migrations/0010_snakeidiom.py21
-rw-r--r--pysite/apps/api/migrations/0011_auto_20181020_1904.py18
-rw-r--r--pysite/apps/api/migrations/0012_specialsnake.py22
-rw-r--r--pysite/apps/api/migrations/0013_specialsnake_image.py21
-rw-r--r--pysite/apps/api/migrations/0014_auto_20181025_1959.py23
-rw-r--r--pysite/apps/api/migrations/0015_auto_20181027_1617.py19
-rw-r--r--pysite/apps/api/migrations/0016_auto_20181027_1619.py18
-rw-r--r--pysite/apps/api/migrations/0017_auto_20181029_1921.py19
-rw-r--r--pysite/apps/api/migrations/0018_messagedeletioncontext.py24
-rw-r--r--pysite/apps/api/migrations/0018_user_rename.py17
-rw-r--r--pysite/apps/api/migrations/0019_deletedmessage.py34
-rw-r--r--pysite/apps/api/migrations/0019_user_in_guild.py18
-rw-r--r--pysite/apps/api/migrations/0020_add_snake_field_validators.py24
-rw-r--r--pysite/apps/api/migrations/0020_infraction.py30
-rw-r--r--pysite/apps/api/migrations/0021_add_special_snake_validator.py19
-rw-r--r--pysite/apps/api/migrations/0021_infraction_reason_null.py18
-rw-r--r--pysite/apps/api/migrations/0021_merge_20181125_1015.py14
-rw-r--r--pysite/apps/api/migrations/0022_infraction_remove_note.py18
-rw-r--r--pysite/apps/api/migrations/0023_merge_infractions_snake_validators.py14
-rw-r--r--pysite/apps/api/migrations/0024_add_note_infraction_type.py18
-rw-r--r--pysite/apps/api/migrations/0025_allow_custom_inserted_at_infraction_field.py19
-rw-r--r--pysite/apps/api/migrations/0026_use_proper_default_for_infraction_insertion_date.py19
-rw-r--r--pysite/apps/api/migrations/0027_merge_20190120_0852.py14
-rw-r--r--pysite/apps/api/migrations/0028_allow_message_content_blank.py18
-rw-r--r--pysite/apps/api/migrations/0029_add_infraction_type_watch.py18
-rw-r--r--pysite/apps/api/migrations/0030_reminder.py27
-rw-r--r--pysite/apps/api/migrations/0031_nomination.py26
-rw-r--r--pysite/apps/api/migrations/0032_botsetting.py23
-rw-r--r--pysite/apps/api/migrations/0033_create_defcon_settings.py30
-rw-r--r--pysite/apps/api/migrations/0034_add_botsetting_name_validator.py20
-rw-r--r--pysite/apps/api/migrations/__init__.py0
40 files changed, 857 insertions, 0 deletions
diff --git a/pysite/apps/api/migrations/0001_initial.py b/pysite/apps/api/migrations/0001_initial.py
new file mode 100644
index 00000000..dca6d17f
--- /dev/null
+++ b/pysite/apps/api/migrations/0001_initial.py
@@ -0,0 +1,21 @@
+# Generated by Django 2.1 on 2018-08-15 17:28
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='SnakeName',
+ fields=[
+ ('name', models.CharField(max_length=100, primary_key=True, serialize=False)),
+ ('scientific', models.CharField(max_length=150)),
+ ],
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0002_documentationlink.py b/pysite/apps/api/migrations/0002_documentationlink.py
new file mode 100644
index 00000000..5dee679a
--- /dev/null
+++ b/pysite/apps/api/migrations/0002_documentationlink.py
@@ -0,0 +1,21 @@
+# Generated by Django 2.1 on 2018-08-16 19:42
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='DocumentationLink',
+ fields=[
+ ('package', models.CharField(max_length=50, primary_key=True, serialize=False)),
+ ('base_url', models.URLField()),
+ ('inventory_url', models.URLField()),
+ ],
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0003_offtopicchannelname.py b/pysite/apps/api/migrations/0003_offtopicchannelname.py
new file mode 100644
index 00000000..2f19bfd8
--- /dev/null
+++ b/pysite/apps/api/migrations/0003_offtopicchannelname.py
@@ -0,0 +1,20 @@
+# Generated by Django 2.1 on 2018-08-31 22:21
+
+import django.core.validators
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0002_documentationlink'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='OffTopicChannelName',
+ fields=[
+ ('name', models.CharField(max_length=96, primary_key=True, serialize=False, validators=[django.core.validators.RegexValidator(regex='^[a-z0-9-]+$')])),
+ ],
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0004_role.py b/pysite/apps/api/migrations/0004_role.py
new file mode 100644
index 00000000..0a6b6c43
--- /dev/null
+++ b/pysite/apps/api/migrations/0004_role.py
@@ -0,0 +1,23 @@
+# Generated by Django 2.1 on 2018-09-01 19:54
+
+import django.core.validators
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0003_offtopicchannelname'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Role',
+ fields=[
+ ('id', models.BigIntegerField(help_text="The role's ID, taken from Discord.", primary_key=True, serialize=False, validators=[django.core.validators.MinValueValidator(limit_value=0, message='Role IDs cannot be negative.')])),
+ ('name', models.CharField(help_text="The role's name, taken from Discord.", max_length=100)),
+ ('colour', models.IntegerField(help_text='The integer value of the colour of this role from Discord.', validators=[django.core.validators.MinValueValidator(limit_value=0, message='Colour hex cannot be negative.')])),
+ ('permissions', models.IntegerField(help_text='The integer value of the permission bitset of this role from Discord.', validators=[django.core.validators.MinValueValidator(limit_value=0, message='Role permissions cannot be negative.'), django.core.validators.MaxValueValidator(limit_value=8589934592, message='Role permission bitset exceeds value of having all permissions')])),
+ ],
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0005_user.py b/pysite/apps/api/migrations/0005_user.py
new file mode 100644
index 00000000..a771119c
--- /dev/null
+++ b/pysite/apps/api/migrations/0005_user.py
@@ -0,0 +1,38 @@
+# Generated by Django 2.1 on 2018-09-01 20:02
+
+import django.core.validators
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0004_role'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Member',
+ fields=[
+ ('id', models.BigIntegerField(help_text='The ID of this user, taken from Discord.', primary_key=True, serialize=False, validators=[django.core.validators.MinValueValidator(limit_value=0, message='User IDs cannot be negative.')])),
+ ('name', models.CharField(help_text='The username, taken from Discord.', max_length=32)),
+ ('discriminator', models.PositiveSmallIntegerField(help_text='The discriminator of this user, taken from Discord.', validators=[django.core.validators.MaxValueValidator(limit_value=9999, message='Discriminators may not exceed `9999`.')])),
+ ('avatar_hash', models.CharField(help_text="The user's avatar hash, taken from Discord. Null if the user does not have any custom avatar.", max_length=100, null=True)),
+ ],
+ ),
+ migrations.AlterField(
+ model_name='role',
+ name='id',
+ field=models.BigIntegerField(help_text='The role ID, taken from Discord.', primary_key=True, serialize=False, validators=[django.core.validators.MinValueValidator(limit_value=0, message='Role IDs cannot be negative.')]),
+ ),
+ migrations.AlterField(
+ model_name='role',
+ name='name',
+ field=models.CharField(help_text='The role name, taken from Discord.', max_length=100),
+ ),
+ migrations.AddField(
+ model_name='member',
+ name='roles',
+ field=models.ManyToManyField(help_text='Any roles this user has on our server.', to='api.Role'),
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0006_add_help_texts.py b/pysite/apps/api/migrations/0006_add_help_texts.py
new file mode 100644
index 00000000..a57d2289
--- /dev/null
+++ b/pysite/apps/api/migrations/0006_add_help_texts.py
@@ -0,0 +1,44 @@
+# Generated by Django 2.1.1 on 2018-09-21 20:26
+
+import django.core.validators
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0005_user'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='documentationlink',
+ name='base_url',
+ field=models.URLField(help_text='The base URL from which documentation will be available for this project. Used to generate links to various symbols within this package.'),
+ ),
+ migrations.AlterField(
+ model_name='documentationlink',
+ name='inventory_url',
+ field=models.URLField(help_text='The URL at which the Sphinx inventory is available for this package.'),
+ ),
+ migrations.AlterField(
+ model_name='documentationlink',
+ name='package',
+ field=models.CharField(help_text='The Python package name that this documentation link belongs to.', max_length=50, primary_key=True, serialize=False),
+ ),
+ migrations.AlterField(
+ model_name='offtopicchannelname',
+ name='name',
+ field=models.CharField(help_text='The actual channel name that will be used on our Discord server.', max_length=96, primary_key=True, serialize=False, validators=[django.core.validators.RegexValidator(regex='^[a-z0-9-]+$')]),
+ ),
+ migrations.AlterField(
+ model_name='snakename',
+ name='name',
+ field=models.CharField(help_text="The regular name for this snake, e.g. 'Python'.", max_length=100, primary_key=True, serialize=False),
+ ),
+ migrations.AlterField(
+ model_name='snakename',
+ name='scientific',
+ field=models.CharField(help_text="The scientific name for this snake, e.g. 'Python bivittatus'.", max_length=150),
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0007_tag.py b/pysite/apps/api/migrations/0007_tag.py
new file mode 100644
index 00000000..d5546ccc
--- /dev/null
+++ b/pysite/apps/api/migrations/0007_tag.py
@@ -0,0 +1,23 @@
+# Generated by Django 2.1.1 on 2018-09-21 22:05
+
+import pysite.apps.api.models
+import django.contrib.postgres.fields.jsonb
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0006_add_help_texts'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Tag',
+ fields=[
+ ('title', models.CharField(help_text='The title of this tag, shown in searches and providing a quick overview over what this embed contains.', max_length=100, primary_key=True, serialize=False)),
+ ('embed', django.contrib.postgres.fields.jsonb.JSONField(help_text='The actual embed shown by this tag.')),
+ ],
+ bases=(pysite.apps.api.models.ModelReprMixin, models.Model),
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0008_tag_embed_validator.py b/pysite/apps/api/migrations/0008_tag_embed_validator.py
new file mode 100644
index 00000000..fd2385d1
--- /dev/null
+++ b/pysite/apps/api/migrations/0008_tag_embed_validator.py
@@ -0,0 +1,23 @@
+# Generated by Django 2.1.1 on 2018-09-23 10:07
+
+import pysite.apps.api.validators
+import django.contrib.postgres.fields.jsonb
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0007_tag'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='tag',
+ name='embed',
+ field=django.contrib.postgres.fields.jsonb.JSONField(help_text='The actual embed shown by this tag.', validators=[
+
+
+ pysite.apps.api.validators.validate_tag_embed]),
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0009_snakefact.py b/pysite/apps/api/migrations/0009_snakefact.py
new file mode 100644
index 00000000..2a136f83
--- /dev/null
+++ b/pysite/apps/api/migrations/0009_snakefact.py
@@ -0,0 +1,21 @@
+# Generated by Django 2.1.2 on 2018-10-11 14:25
+
+import pysite.apps.api.models
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0008_tag_embed_validator'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='SnakeFact',
+ fields=[
+ ('fact', models.CharField(help_text='A fact about snakes.', max_length=200, primary_key=True, serialize=False)),
+ ],
+ bases=(pysite.apps.api.models.ModelReprMixin, models.Model),
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0010_snakeidiom.py b/pysite/apps/api/migrations/0010_snakeidiom.py
new file mode 100644
index 00000000..3eb99198
--- /dev/null
+++ b/pysite/apps/api/migrations/0010_snakeidiom.py
@@ -0,0 +1,21 @@
+# Generated by Django 2.1.2 on 2018-10-19 16:27
+
+import pysite.apps.api.models
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0009_snakefact'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='SnakeIdiom',
+ fields=[
+ ('idiom', models.CharField(help_text='A snake idiom', max_length=140, primary_key=True, serialize=False)),
+ ],
+ bases=(pysite.apps.api.models.ModelReprMixin, models.Model),
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0011_auto_20181020_1904.py b/pysite/apps/api/migrations/0011_auto_20181020_1904.py
new file mode 100644
index 00000000..bb5a6325
--- /dev/null
+++ b/pysite/apps/api/migrations/0011_auto_20181020_1904.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.1.2 on 2018-10-20 19:04
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0010_snakeidiom'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='snakeidiom',
+ name='idiom',
+ field=models.CharField(help_text='A saying about a snake.', max_length=140, primary_key=True, serialize=False),
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0012_specialsnake.py b/pysite/apps/api/migrations/0012_specialsnake.py
new file mode 100644
index 00000000..ecf1b9d9
--- /dev/null
+++ b/pysite/apps/api/migrations/0012_specialsnake.py
@@ -0,0 +1,22 @@
+# Generated by Django 2.1.2 on 2018-10-22 09:53
+
+import pysite.apps.api.models
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0011_auto_20181020_1904'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='SpecialSnake',
+ fields=[
+ ('name', models.CharField(max_length=140, primary_key=True, serialize=False)),
+ ('info', models.TextField()),
+ ],
+ bases=(pysite.apps.api.models.ModelReprMixin, models.Model),
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0013_specialsnake_image.py b/pysite/apps/api/migrations/0013_specialsnake_image.py
new file mode 100644
index 00000000..a0d0d318
--- /dev/null
+++ b/pysite/apps/api/migrations/0013_specialsnake_image.py
@@ -0,0 +1,21 @@
+# Generated by Django 2.1.2 on 2018-10-23 11:51
+
+import datetime
+from django.db import migrations, models
+from django.utils.timezone import utc
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0012_specialsnake'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='specialsnake',
+ name='image',
+ field=models.URLField(default=datetime.datetime(2018, 10, 23, 11, 51, 23, 703868, tzinfo=utc)),
+ preserve_default=False,
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0014_auto_20181025_1959.py b/pysite/apps/api/migrations/0014_auto_20181025_1959.py
new file mode 100644
index 00000000..3599d2cd
--- /dev/null
+++ b/pysite/apps/api/migrations/0014_auto_20181025_1959.py
@@ -0,0 +1,23 @@
+# Generated by Django 2.1.2 on 2018-10-25 19:59
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0013_specialsnake_image'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='specialsnake',
+ name='info',
+ field=models.TextField(help_text='Info about a special snake.'),
+ ),
+ migrations.AlterField(
+ model_name='specialsnake',
+ name='name',
+ field=models.CharField(help_text='A special snake name.', max_length=140, primary_key=True, serialize=False),
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0015_auto_20181027_1617.py b/pysite/apps/api/migrations/0015_auto_20181027_1617.py
new file mode 100644
index 00000000..8973ff6d
--- /dev/null
+++ b/pysite/apps/api/migrations/0015_auto_20181027_1617.py
@@ -0,0 +1,19 @@
+# Generated by Django 2.1.2 on 2018-10-27 16:17
+
+import django.contrib.postgres.fields
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0014_auto_20181025_1959'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='specialsnake',
+ name='image',
+ field=django.contrib.postgres.fields.ArrayField(base_field=models.URLField(), size=None),
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0016_auto_20181027_1619.py b/pysite/apps/api/migrations/0016_auto_20181027_1619.py
new file mode 100644
index 00000000..b8bdfb16
--- /dev/null
+++ b/pysite/apps/api/migrations/0016_auto_20181027_1619.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.1.2 on 2018-10-27 16:19
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0015_auto_20181027_1617'),
+ ]
+
+ operations = [
+ migrations.RenameField(
+ model_name='specialsnake',
+ old_name='image',
+ new_name='images',
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0017_auto_20181029_1921.py b/pysite/apps/api/migrations/0017_auto_20181029_1921.py
new file mode 100644
index 00000000..012bda61
--- /dev/null
+++ b/pysite/apps/api/migrations/0017_auto_20181029_1921.py
@@ -0,0 +1,19 @@
+# Generated by Django 2.1.2 on 2018-10-29 19:21
+
+import django.contrib.postgres.fields
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0016_auto_20181027_1619'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='specialsnake',
+ name='images',
+ field=django.contrib.postgres.fields.ArrayField(base_field=models.URLField(), help_text='Images displaying this special snake.', size=None),
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0018_messagedeletioncontext.py b/pysite/apps/api/migrations/0018_messagedeletioncontext.py
new file mode 100644
index 00000000..10428ceb
--- /dev/null
+++ b/pysite/apps/api/migrations/0018_messagedeletioncontext.py
@@ -0,0 +1,24 @@
+# Generated by Django 2.1.1 on 2018-11-18 20:12
+
+import pysite.apps.api.models
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0017_auto_20181029_1921'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='MessageDeletionContext',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('creation', models.DateTimeField(help_text='When this deletion took place.')),
+ ('actor', models.ForeignKey(help_text='The original actor causing this deletion. Could be the author of a manual clean command invocation, the bot when executing automatic actions, or nothing to indicate that the bulk deletion was not issued by us.', null=True, on_delete=django.db.models.deletion.CASCADE, to='api.User')),
+ ],
+ bases=(pysite.apps.api.models.ModelReprMixin, models.Model),
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0018_user_rename.py b/pysite/apps/api/migrations/0018_user_rename.py
new file mode 100644
index 00000000..f88eb5bc
--- /dev/null
+++ b/pysite/apps/api/migrations/0018_user_rename.py
@@ -0,0 +1,17 @@
+# Generated by Django 2.1.3 on 2018-11-19 20:09
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0017_auto_20181029_1921'),
+ ]
+
+ operations = [
+ migrations.RenameModel(
+ old_name='Member',
+ new_name='User',
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0019_deletedmessage.py b/pysite/apps/api/migrations/0019_deletedmessage.py
new file mode 100644
index 00000000..cb4c59f2
--- /dev/null
+++ b/pysite/apps/api/migrations/0019_deletedmessage.py
@@ -0,0 +1,34 @@
+# Generated by Django 2.1.1 on 2018-11-18 20:26
+
+import pysite.apps.api.models
+import pysite.apps.api.validators
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0018_messagedeletioncontext'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='DeletedMessage',
+ fields=[
+ ('id', models.BigIntegerField(help_text='The message ID as taken from Discord.', primary_key=True, serialize=False, validators=[django.core.validators.MinValueValidator(limit_value=0, message='Message IDs cannot be negative.')])),
+ ('channel_id', models.BigIntegerField(help_text='The channel ID that this message was sent in, taken from Discord.', validators=[django.core.validators.MinValueValidator(limit_value=0, message='Channel IDs cannot be negative.')])),
+ ('content', models.CharField(help_text='The content of this message, taken from Discord.', max_length=2000)),
+ ('embeds', django.contrib.postgres.fields.ArrayField(base_field=django.contrib.postgres.fields.jsonb.JSONField(validators=[
+
+
+ pysite.apps.api.validators.validate_tag_embed]), help_text='Embeds attached to this message.', size=None)),
+ ('author', models.ForeignKey(help_text='The author of this message.', on_delete=django.db.models.deletion.CASCADE, to='api.User')),
+ ('deletion_context', models.ForeignKey(help_text='The deletion context this message is part of.', on_delete=django.db.models.deletion.CASCADE, to='api.MessageDeletionContext')),
+ ],
+ options={
+ 'abstract': False,
+ },
+ bases=(pysite.apps.api.models.ModelReprMixin, models.Model),
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0019_user_in_guild.py b/pysite/apps/api/migrations/0019_user_in_guild.py
new file mode 100644
index 00000000..fda008c4
--- /dev/null
+++ b/pysite/apps/api/migrations/0019_user_in_guild.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.1.3 on 2018-11-19 20:30
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0018_user_rename'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='user',
+ name='in_guild',
+ field=models.BooleanField(default=True, help_text='Whether this user is in our server.'),
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0020_add_snake_field_validators.py b/pysite/apps/api/migrations/0020_add_snake_field_validators.py
new file mode 100644
index 00000000..3b625f9b
--- /dev/null
+++ b/pysite/apps/api/migrations/0020_add_snake_field_validators.py
@@ -0,0 +1,24 @@
+# Generated by Django 2.1.2 on 2018-11-24 17:11
+
+import django.core.validators
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0019_user_in_guild'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='snakename',
+ name='name',
+ field=models.CharField(help_text="The regular name for this snake, e.g. 'Python'.", max_length=100, primary_key=True, serialize=False, validators=[django.core.validators.RegexValidator(regex='^([^0-9])+$')]),
+ ),
+ migrations.AlterField(
+ model_name='snakename',
+ name='scientific',
+ field=models.CharField(help_text="The scientific name for this snake, e.g. 'Python bivittatus'.", max_length=150, validators=[django.core.validators.RegexValidator(regex='^([^0-9])+$')]),
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0020_infraction.py b/pysite/apps/api/migrations/0020_infraction.py
new file mode 100644
index 00000000..7f7d5a41
--- /dev/null
+++ b/pysite/apps/api/migrations/0020_infraction.py
@@ -0,0 +1,30 @@
+# Generated by Django 2.1.3 on 2018-11-19 22:02
+
+import pysite.apps.api.models
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0019_user_in_guild'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Infraction',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('inserted_at', models.DateTimeField(auto_now_add=True, help_text='The date and time of the creation of this infraction.')),
+ ('expires_at', models.DateTimeField(help_text="The date and time of the expiration of this infraction. Null if the infraction is permanent or it can't expire.", null=True)),
+ ('active', models.BooleanField(default=True, help_text='Whether the infraction is still active.')),
+ ('type', models.CharField(choices=[('note', 'Note'), ('warning', 'Warning'), ('mute', 'Mute'), ('ban', 'Ban'), ('kick', 'Kick'), ('superstar', 'Superstar')], help_text='The type of the infraction.', max_length=9)),
+ ('reason', models.TextField(help_text='The reason for the infraction.')),
+ ('hidden', models.BooleanField(default=False, help_text='Whether the infraction is a shadow infraction.')),
+ ('actor', models.ForeignKey(help_text='The user which applied the infraction.', on_delete=django.db.models.deletion.CASCADE, related_name='infractions_given', to='api.User')),
+ ('user', models.ForeignKey(help_text='The user to which the infraction was applied.', on_delete=django.db.models.deletion.CASCADE, related_name='infractions_received', to='api.User')),
+ ],
+ bases=(pysite.apps.api.models.ModelReprMixin, models.Model),
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0021_add_special_snake_validator.py b/pysite/apps/api/migrations/0021_add_special_snake_validator.py
new file mode 100644
index 00000000..d41b96e5
--- /dev/null
+++ b/pysite/apps/api/migrations/0021_add_special_snake_validator.py
@@ -0,0 +1,19 @@
+# Generated by Django 2.1.2 on 2018-11-25 14:59
+
+import django.core.validators
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0020_add_snake_field_validators'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='specialsnake',
+ name='name',
+ field=models.CharField(help_text='A special snake name.', max_length=140, primary_key=True, serialize=False, validators=[django.core.validators.RegexValidator(regex='^([^0-9])+$')]),
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0021_infraction_reason_null.py b/pysite/apps/api/migrations/0021_infraction_reason_null.py
new file mode 100644
index 00000000..6600f230
--- /dev/null
+++ b/pysite/apps/api/migrations/0021_infraction_reason_null.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.1.3 on 2018-11-21 00:50
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0020_infraction'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='infraction',
+ name='reason',
+ field=models.TextField(help_text='The reason for the infraction.', null=True),
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0021_merge_20181125_1015.py b/pysite/apps/api/migrations/0021_merge_20181125_1015.py
new file mode 100644
index 00000000..d8eaa510
--- /dev/null
+++ b/pysite/apps/api/migrations/0021_merge_20181125_1015.py
@@ -0,0 +1,14 @@
+# Generated by Django 2.1.1 on 2018-11-25 10:15
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0020_add_snake_field_validators'),
+ ('api', '0019_deletedmessage'),
+ ]
+
+ operations = [
+ ]
diff --git a/pysite/apps/api/migrations/0022_infraction_remove_note.py b/pysite/apps/api/migrations/0022_infraction_remove_note.py
new file mode 100644
index 00000000..eba84610
--- /dev/null
+++ b/pysite/apps/api/migrations/0022_infraction_remove_note.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.1.3 on 2018-11-21 21:07
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0021_infraction_reason_null'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='infraction',
+ name='type',
+ field=models.CharField(choices=[('warning', 'Warning'), ('mute', 'Mute'), ('ban', 'Ban'), ('kick', 'Kick'), ('superstar', 'Superstar')], help_text='The type of the infraction.', max_length=9),
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0023_merge_infractions_snake_validators.py b/pysite/apps/api/migrations/0023_merge_infractions_snake_validators.py
new file mode 100644
index 00000000..916f78f2
--- /dev/null
+++ b/pysite/apps/api/migrations/0023_merge_infractions_snake_validators.py
@@ -0,0 +1,14 @@
+# Generated by Django 2.1.3 on 2018-11-29 19:37
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0022_infraction_remove_note'),
+ ('api', '0021_add_special_snake_validator'),
+ ]
+
+ operations = [
+ ]
diff --git a/pysite/apps/api/migrations/0024_add_note_infraction_type.py b/pysite/apps/api/migrations/0024_add_note_infraction_type.py
new file mode 100644
index 00000000..4adb53b8
--- /dev/null
+++ b/pysite/apps/api/migrations/0024_add_note_infraction_type.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.1.4 on 2019-01-05 14:52
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0023_merge_infractions_snake_validators'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='infraction',
+ name='type',
+ field=models.CharField(choices=[('note', 'Note'), ('warning', 'Warning'), ('mute', 'Mute'), ('kick', 'Kick'), ('ban', 'Ban'), ('superstar', 'Superstar')], help_text='The type of the infraction.', max_length=9),
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0025_allow_custom_inserted_at_infraction_field.py b/pysite/apps/api/migrations/0025_allow_custom_inserted_at_infraction_field.py
new file mode 100644
index 00000000..0c02cb91
--- /dev/null
+++ b/pysite/apps/api/migrations/0025_allow_custom_inserted_at_infraction_field.py
@@ -0,0 +1,19 @@
+# Generated by Django 2.1.4 on 2019-01-06 16:01
+
+import datetime
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0024_add_note_infraction_type'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='infraction',
+ name='inserted_at',
+ field=models.DateTimeField(default=datetime.datetime.utcnow, help_text='The date and time of the creation of this infraction.'),
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0026_use_proper_default_for_infraction_insertion_date.py b/pysite/apps/api/migrations/0026_use_proper_default_for_infraction_insertion_date.py
new file mode 100644
index 00000000..56f3b2b8
--- /dev/null
+++ b/pysite/apps/api/migrations/0026_use_proper_default_for_infraction_insertion_date.py
@@ -0,0 +1,19 @@
+# Generated by Django 2.1.5 on 2019-01-09 19:50
+
+from django.db import migrations, models
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0025_allow_custom_inserted_at_infraction_field'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='infraction',
+ name='inserted_at',
+ field=models.DateTimeField(default=django.utils.timezone.now, help_text='The date and time of the creation of this infraction.'),
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0027_merge_20190120_0852.py b/pysite/apps/api/migrations/0027_merge_20190120_0852.py
new file mode 100644
index 00000000..6fab4fd0
--- /dev/null
+++ b/pysite/apps/api/migrations/0027_merge_20190120_0852.py
@@ -0,0 +1,14 @@
+# Generated by Django 2.1.5 on 2019-01-20 08:52
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0026_use_proper_default_for_infraction_insertion_date'),
+ ('api', '0021_merge_20181125_1015'),
+ ]
+
+ operations = [
+ ]
diff --git a/pysite/apps/api/migrations/0028_allow_message_content_blank.py b/pysite/apps/api/migrations/0028_allow_message_content_blank.py
new file mode 100644
index 00000000..6d57db27
--- /dev/null
+++ b/pysite/apps/api/migrations/0028_allow_message_content_blank.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.1.5 on 2019-01-20 09:41
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0027_merge_20190120_0852'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='deletedmessage',
+ name='content',
+ field=models.CharField(blank=True, help_text='The content of this message, taken from Discord.', max_length=2000),
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0029_add_infraction_type_watch.py b/pysite/apps/api/migrations/0029_add_infraction_type_watch.py
new file mode 100644
index 00000000..c6f88a11
--- /dev/null
+++ b/pysite/apps/api/migrations/0029_add_infraction_type_watch.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.1.5 on 2019-01-20 11:52
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0028_allow_message_content_blank'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='infraction',
+ name='type',
+ field=models.CharField(choices=[('note', 'Note'), ('warning', 'Warning'), ('watch', 'Watch'), ('mute', 'Mute'), ('kick', 'Kick'), ('ban', 'Ban'), ('superstar', 'Superstar')], help_text='The type of the infraction.', max_length=9),
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0030_reminder.py b/pysite/apps/api/migrations/0030_reminder.py
new file mode 100644
index 00000000..8448ac8c
--- /dev/null
+++ b/pysite/apps/api/migrations/0030_reminder.py
@@ -0,0 +1,27 @@
+# Generated by Django 2.1.5 on 2019-01-22 22:17
+
+import pysite.apps.api.models
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0029_add_infraction_type_watch'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Reminder',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('active', models.BooleanField(default=True, help_text='Whether this reminder is still active. If not, it has been sent out to the user.')),
+ ('channel_id', models.BigIntegerField(help_text='The channel ID that this message was sent in, taken from Discord.', validators=[django.core.validators.MinValueValidator(limit_value=0, message='Channel IDs cannot be negative.')])),
+ ('content', models.CharField(help_text='The content that the user wants to be reminded of.', max_length=1500)),
+ ('expiration', models.DateTimeField(help_text='When this reminder should be sent.')),
+ ('author', models.ForeignKey(help_text='The creator of this reminder.', on_delete=django.db.models.deletion.CASCADE, to='api.User')),
+ ],
+ bases=(pysite.apps.api.models.ModelReprMixin, models.Model),
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0031_nomination.py b/pysite/apps/api/migrations/0031_nomination.py
new file mode 100644
index 00000000..f15da5c3
--- /dev/null
+++ b/pysite/apps/api/migrations/0031_nomination.py
@@ -0,0 +1,26 @@
+# Generated by Django 2.1.5 on 2019-01-27 11:01
+
+import pysite.apps.api.models
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0030_reminder'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Nomination',
+ fields=[
+ ('active', models.BooleanField(default=True, help_text='Whether this nomination is still relevant.')),
+ ('reason', models.TextField(help_text='Why this user was nominated.')),
+ ('user', models.OneToOneField(help_text='The nominated user.', on_delete=django.db.models.deletion.CASCADE, primary_key=True, related_name='nomination', serialize=False, to='api.User')),
+ ('inserted_at', models.DateTimeField(auto_now_add=True, help_text='The creation date of this nomination.')),
+ ('author', models.ForeignKey(help_text='The staff member that nominated this user.', on_delete=django.db.models.deletion.CASCADE, related_name='nomination_set', to='api.User')),
+ ],
+ bases=(pysite.apps.api.models.ModelReprMixin, models.Model),
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0032_botsetting.py b/pysite/apps/api/migrations/0032_botsetting.py
new file mode 100644
index 00000000..b7916dff
--- /dev/null
+++ b/pysite/apps/api/migrations/0032_botsetting.py
@@ -0,0 +1,23 @@
+# Generated by Django 2.1.5 on 2019-02-07 19:03
+
+import pysite.apps.api.models
+import django.contrib.postgres.fields.jsonb
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0031_nomination'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='BotSetting',
+ fields=[
+ ('name', models.CharField(max_length=50, primary_key=True, serialize=False)),
+ ('data', django.contrib.postgres.fields.jsonb.JSONField(help_text='The actual settings of this setting.')),
+ ],
+ bases=(pysite.apps.api.models.ModelReprMixin, models.Model),
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/0033_create_defcon_settings.py b/pysite/apps/api/migrations/0033_create_defcon_settings.py
new file mode 100644
index 00000000..830f3fb0
--- /dev/null
+++ b/pysite/apps/api/migrations/0033_create_defcon_settings.py
@@ -0,0 +1,30 @@
+# Generated by Django 2.1.5 on 2019-02-18 19:30
+
+from django.db import migrations
+
+
+def up(apps, schema_editor):
+ BotSetting = apps.get_model('api', 'BotSetting')
+ setting = BotSetting(
+ name='defcon',
+ data={
+ 'enabled': False,
+ 'days': 0
+ }
+ ).save()
+
+
+def down(apps, schema_editor): # pragma: no cover - not necessary to test
+ BotSetting = apps.get_model('api', 'BotSetting')
+ BotSetting.get(name='defcon').delete()
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0032_botsetting'),
+ ]
+
+ operations = [
+ migrations.RunPython(up, down)
+ ]
diff --git a/pysite/apps/api/migrations/0034_add_botsetting_name_validator.py b/pysite/apps/api/migrations/0034_add_botsetting_name_validator.py
new file mode 100644
index 00000000..79aee41e
--- /dev/null
+++ b/pysite/apps/api/migrations/0034_add_botsetting_name_validator.py
@@ -0,0 +1,20 @@
+# Generated by Django 2.1.5 on 2019-02-18 19:41
+
+import pysite.apps.api.validators
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0033_create_defcon_settings'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='botsetting',
+ name='name',
+ field=models.CharField(max_length=50, primary_key=True, serialize=False, validators=[
+ pysite.apps.api.validators.validate_bot_setting_name]),
+ ),
+ ]
diff --git a/pysite/apps/api/migrations/__init__.py b/pysite/apps/api/migrations/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/pysite/apps/api/migrations/__init__.py