diff options
4 files changed, 22 insertions, 1 deletions
| diff --git a/pydis_site/apps/api/migrations/0085_new_filter_schema.py b/pydis_site/apps/api/migrations/0085_new_filter_schema.py index d16c26ac..2e721df4 100644 --- a/pydis_site/apps/api/migrations/0085_new_filter_schema.py +++ b/pydis_site/apps/api/migrations/0085_new_filter_schema.py @@ -3,6 +3,7 @@ from datetime import timedelta  import django.contrib.postgres.fields  from django.apps.registry import Apps +from django.core.validators import MinValueValidator  from django.db import migrations, models  import django.db.models.deletion  from django.db.backends.base.schema import BaseDatabaseSchemaEditor @@ -48,6 +49,7 @@ def forward(apps: Apps, schema_editor: BaseDatabaseSchemaEditor) -> None:              infraction_type="",              infraction_reason="",              infraction_duration=timedelta(seconds=0), +            infraction_channel=None,              disabled_channels=[],              disabled_categories=(["CODE JAM"] if name in ("FILE_FORMAT", "GUILD_INVITE") else []),              enabled_channels=[], @@ -72,6 +74,7 @@ def forward(apps: Apps, schema_editor: BaseDatabaseSchemaEditor) -> None:                  infraction_type=None,                  infraction_reason=None,                  infraction_duration=None, +                infraction_channel=None,                  disabled_channels=None,                  disabled_categories=None,                  enabled_channels=None, @@ -110,6 +113,7 @@ class Migration(migrations.Migration):                  ('infraction_type', models.CharField(choices=[('NOTE', 'Note'), ('WARNING', 'Warning'), ('WATCH', 'Watch'), ('MUTE', 'Mute'), ('KICK', 'Kick'), ('BAN', 'Ban'), ('SUPERSTAR', 'Superstar'), ('VOICE_BAN', 'Voice Ban'), ('VOICE_MUTE', 'Voice Mute')], help_text='The infraction to apply to this user.', max_length=10, null=True)),                  ('infraction_reason', models.CharField(help_text='The reason to give for the infraction.', max_length=1000, null=True)),                  ('infraction_duration', models.DurationField(help_text='The duration of the infraction. Null if permanent.', null=True)), +                ('infraction_channel', models.BigIntegerField(validators=(MinValueValidator(limit_value=0, message="Channel IDs cannot be negative."),), help_text="Channel in which to send the infraction.", null=True)),                  ('disabled_channels', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100), help_text="Channels in which to not run the filter.", null=True, size=None)),                  ('disabled_categories', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100), help_text="Categories in which to not run the filter.", null=True, size=None)),                  ('enabled_channels', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100), help_text="Channels in which to run the filter even if it's disabled in the category.", null=True, size=None)), @@ -134,6 +138,7 @@ class Migration(migrations.Migration):                  ('infraction_type', models.CharField(choices=[('NOTE', 'Note'), ('WARNING', 'Warning'), ('WATCH', 'Watch'), ('MUTE', 'Mute'), ('KICK', 'Kick'), ('BAN', 'Ban'), ('SUPERSTAR', 'Superstar'), ('VOICE_BAN', 'Voice Ban'), ('VOICE_MUTE', 'Voice Mute')], help_text='The infraction to apply to this user.', max_length=10, null=True)),                  ('infraction_reason', models.CharField(help_text='The reason to give for the infraction.', max_length=1000, null=True)),                  ('infraction_duration', models.DurationField(help_text='The duration of the infraction. Null if permanent.', null=True)), +                ('infraction_channel', models.BigIntegerField(validators=(MinValueValidator(limit_value=0, message="Channel IDs cannot be negative."),), help_text="Channel in which to send the infraction.", null=True)),                  ('disabled_channels', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100), help_text="Channels in which to not run the filter.", size=None)),                  ('disabled_categories', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100), help_text="Categories in which to not run the filter.", size=None)),                  ('enabled_channels', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100), help_text="Channels in which to run the filter even if it's disabled in the category.", size=None)), diff --git a/pydis_site/apps/api/migrations/0086_unique_constraint_filters.py b/pydis_site/apps/api/migrations/0086_unique_constraint_filters.py index 8072ed2e..e7816e19 100644 --- a/pydis_site/apps/api/migrations/0086_unique_constraint_filters.py +++ b/pydis_site/apps/api/migrations/0086_unique_constraint_filters.py @@ -18,6 +18,7 @@ class Migration(migrations.Migration):                  'infraction_type',                  'infraction_reason',                  'infraction_duration', +                'infraction_channel',                  'content',                  'additional_field',                  'filter_list', diff --git a/pydis_site/apps/api/models/bot/filters.py b/pydis_site/apps/api/models/bot/filters.py index 95a10e42..22482870 100644 --- a/pydis_site/apps/api/models/bot/filters.py +++ b/pydis_site/apps/api/models/bot/filters.py @@ -1,4 +1,5 @@  from django.contrib.postgres.fields import ArrayField +from django.core.validators import MinValueValidator  from django.db import models  from django.db.models import UniqueConstraint @@ -41,6 +42,16 @@ class FilterSettingsMixin(models.Model):          null=True,          help_text="The duration of the infraction. Null if permanent."      ) +    infraction_channel = models.BigIntegerField( +        validators=( +            MinValueValidator( +                limit_value=0, +                message="Channel IDs cannot be negative." +            ), +        ), +        help_text="Channel in which to send the infraction.", +        null=True +    )      class Meta:          """Metaclass for settings mixin.""" diff --git a/pydis_site/apps/api/serializers.py b/pydis_site/apps/api/serializers.py index 0dcbf2ee..83471ca2 100644 --- a/pydis_site/apps/api/serializers.py +++ b/pydis_site/apps/api/serializers.py @@ -148,6 +148,7 @@ ALWAYS_OPTIONAL_SETTINGS = (      'infraction_type',      'infraction_reason',      'infraction_duration', +    'infraction_channel',  )  REQUIRED_FOR_FILTER_LIST_SETTINGS = ( @@ -178,6 +179,7 @@ INFRACTION_AND_NOTIFICATION_FIELDS = (      "infraction_type",      "infraction_reason",      "infraction_duration", +    "infraction_channel",      "dm_content",      "dm_embed"  ) @@ -230,6 +232,7 @@ class FilterSerializer(ModelSerializer):              'infraction_reason': {'allow_blank': True, 'allow_null': True, 'required': False},              'enabled_channels': {'allow_empty': True, 'allow_null': True, 'required': False},              'disabled_channels': {'allow_empty': True, 'allow_null': True, 'required': False}, +            'enabled_categories': {'allow_empty': True, 'allow_null': True, 'required': False},              'disabled_categories': {'allow_empty': True, 'allow_null': True, 'required': False},          } @@ -305,6 +308,7 @@ class FilterListSerializer(ModelSerializer):              'infraction_reason': {'allow_blank': True, 'allow_null': True, 'required': False},              'enabled_channels': {'allow_empty': True},              'disabled_channels': {'allow_empty': True}, +            'enabled_categories': {'allow_empty': True},              'disabled_categories': {'allow_empty': True},          } @@ -314,7 +318,7 @@ class FilterListSerializer(ModelSerializer):                  queryset=FilterList.objects.all(),                  fields=('name', 'list_type'),                  message=( -                    "A filterlist with the same name and type already exist." +                    "A filterlist with the same name and type already exists."                  )              ),          ] | 
