aboutsummaryrefslogtreecommitdiffstats
path: root/pydis_site/apps
diff options
context:
space:
mode:
authorGravatar mbaruh <[email protected]>2022-11-04 00:30:04 +0200
committerGravatar mbaruh <[email protected]>2022-11-04 00:30:04 +0200
commitfee81cf1f4205024d663fc8055f04ed22bec9f32 (patch)
treee6c81a0129946c8d283e961a033888ac3b64eefa /pydis_site/apps
parentAdd antispam list in migrations (diff)
Stop using None as a valid setting value
See e100ae9b on bot
Diffstat (limited to 'pydis_site/apps')
-rw-r--r--pydis_site/apps/api/migrations/0085_new_filter_schema.py18
-rw-r--r--pydis_site/apps/api/migrations/0086_unique_constraint_filters.py6
-rw-r--r--pydis_site/apps/api/migrations/0087_unique_filter_list.py4
-rw-r--r--pydis_site/apps/api/migrations/0088_antispam_filter_list.py4
-rw-r--r--pydis_site/apps/api/models/bot/filters.py84
-rw-r--r--pydis_site/apps/api/serializers.py23
6 files changed, 82 insertions, 57 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 a38194ef..b0665ba5 100644
--- a/pydis_site/apps/api/migrations/0085_new_filter_schema.py
+++ b/pydis_site/apps/api/migrations/0085_new_filter_schema.py
@@ -46,10 +46,10 @@ def forward(apps: Apps, schema_editor: BaseDatabaseSchemaEditor) -> None:
enabled=True,
dm_content=dm_content,
dm_embed="" if name != "FILE_FORMAT" else "*Defined at runtime.*",
- infraction_type="",
+ infraction_type="NONE",
infraction_reason="",
infraction_duration=timedelta(seconds=0),
- infraction_channel=None,
+ infraction_channel=0,
disabled_channels=[],
disabled_categories=(["CODE JAM"] if name in ("FILE_FORMAT", "GUILD_INVITE") else []),
enabled_channels=[],
@@ -110,7 +110,7 @@ class Migration(migrations.Migration):
('enabled', models.BooleanField(help_text='Whether this filter is currently enabled.', null=True)),
('dm_content', models.CharField(help_text='The DM to send to a user triggering this filter.', max_length=1000, null=True, blank=True)),
('dm_embed', models.CharField(help_text='The content of the DM embed', max_length=2000, null=True, blank=True)),
- ('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_type', models.CharField(choices=[('NONE', 'None'), ('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, blank=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)),
@@ -133,12 +133,12 @@ class Migration(migrations.Migration):
('delete_messages', models.BooleanField(help_text='Whether this filter should delete messages triggering it.')),
('bypass_roles', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100), help_text='Roles and users who can bypass this filter.', size=None)),
('enabled', models.BooleanField(help_text='Whether this filter is currently enabled.')),
- ('dm_content', models.CharField(help_text='The DM to send to a user triggering this filter.', max_length=1000, null=True, blank=True)),
- ('dm_embed', models.CharField(help_text='The content of the DM embed', max_length=2000, null=True, blank=True)),
- ('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, blank=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)),
+ ('dm_content', models.CharField(help_text='The DM to send to a user triggering this filter.', max_length=1000, blank=True)),
+ ('dm_embed', models.CharField(help_text='The content of the DM embed', max_length=2000, blank=True)),
+ ('infraction_type', models.CharField(choices=[('NONE', 'None'), ('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)),
+ ('infraction_reason', models.CharField(help_text='The reason to give for the infraction.', max_length=1000, blank=True)),
+ ('infraction_duration', models.DurationField(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.")),
('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 e7816e19..6fa99e9e 100644
--- a/pydis_site/apps/api/migrations/0086_unique_constraint_filters.py
+++ b/pydis_site/apps/api/migrations/0086_unique_constraint_filters.py
@@ -13,15 +13,15 @@ class Migration(migrations.Migration):
migrations.AddConstraint(
model_name='filter',
constraint=models.UniqueConstraint(fields=(
+ 'content',
+ 'additional_field',
+ 'filter_list',
'dm_content',
'dm_embed',
'infraction_type',
'infraction_reason',
'infraction_duration',
'infraction_channel',
- 'content',
- 'additional_field',
- 'filter_list',
'guild_pings',
'filter_dm',
'dm_pings',
diff --git a/pydis_site/apps/api/migrations/0087_unique_filter_list.py b/pydis_site/apps/api/migrations/0087_unique_filter_list.py
index 843bb00a..9db966fb 100644
--- a/pydis_site/apps/api/migrations/0087_unique_filter_list.py
+++ b/pydis_site/apps/api/migrations/0087_unique_filter_list.py
@@ -22,10 +22,10 @@ def create_unique_list(apps: Apps, _):
enabled=True,
dm_content="",
dm_embed="",
- infraction_type="",
+ infraction_type="NONE",
infraction_reason="",
infraction_duration=timedelta(seconds=0),
- infraction_channel=None,
+ infraction_channel=0,
disabled_channels=[],
disabled_categories=[],
enabled_channels=[],
diff --git a/pydis_site/apps/api/migrations/0088_antispam_filter_list.py b/pydis_site/apps/api/migrations/0088_antispam_filter_list.py
index d425293f..354e4520 100644
--- a/pydis_site/apps/api/migrations/0088_antispam_filter_list.py
+++ b/pydis_site/apps/api/migrations/0088_antispam_filter_list.py
@@ -22,10 +22,10 @@ def create_antispam_list(apps: Apps, _):
enabled=True,
dm_content="",
dm_embed="",
- infraction_type="mute",
+ infraction_type="MUTE",
infraction_reason="",
infraction_duration=timedelta(seconds=600),
- infraction_channel=None,
+ infraction_channel=0,
disabled_channels=[],
disabled_categories=["CODE JAM"],
enabled_channels=[],
diff --git a/pydis_site/apps/api/models/bot/filters.py b/pydis_site/apps/api/models/bot/filters.py
index 81b72c6e..7398f8a0 100644
--- a/pydis_site/apps/api/models/bot/filters.py
+++ b/pydis_site/apps/api/models/bot/filters.py
@@ -14,35 +14,43 @@ class FilterListType(models.IntegerChoices):
DENY = 0
-class FilterSettingsMixin(models.Model):
- """Mixin for common settings of a filters and filter lists."""
+class FilterList(models.Model):
+ """Represent a list in its allow or deny form."""
+ name = models.CharField(max_length=50, help_text="The unique name of this list.")
+ list_type = models.IntegerField(
+ choices=FilterListType.choices,
+ help_text="Whether this list is an allowlist or denylist"
+ )
dm_content = models.CharField(
max_length=1000,
- null=True,
+ null=False,
blank=True,
help_text="The DM to send to a user triggering this filter."
)
dm_embed = models.CharField(
max_length=2000,
help_text="The content of the DM embed",
- null=True,
+ null=False,
blank=True
)
infraction_type = models.CharField(
- choices=[(choices[0].upper(), choices[1]) for choices in Infraction.TYPE_CHOICES],
+ choices=[
+ (choices[0].upper(), choices[1])
+ for choices in [("NONE", "None"), *Infraction.TYPE_CHOICES]
+ ],
max_length=10,
- null=True,
+ null=False,
help_text="The infraction to apply to this user."
)
infraction_reason = models.CharField(
max_length=1000,
help_text="The reason to give for the infraction.",
blank=True,
- null=True
+ null=False
)
infraction_duration = models.DurationField(
- null=True,
+ null=False,
help_text="The duration of the infraction. Null if permanent."
)
infraction_channel = models.BigIntegerField(
@@ -53,22 +61,7 @@ class FilterSettingsMixin(models.Model):
),
),
help_text="Channel in which to send the infraction.",
- null=True
- )
-
- class Meta:
- """Metaclass for settings mixin."""
-
- abstract = True
-
-
-class FilterList(FilterSettingsMixin):
- """Represent a list in its allow or deny form."""
-
- name = models.CharField(max_length=50, help_text="The unique name of this list.")
- list_type = models.IntegerField(
- choices=FilterListType.choices,
- help_text="Whether this list is an allowlist or denylist"
+ null=False
)
guild_pings = ArrayField(
models.CharField(max_length=100),
@@ -126,7 +119,7 @@ class FilterList(FilterSettingsMixin):
return f"Filter {FilterListType(self.list_type).label}list {self.name!r}"
-class FilterBase(FilterSettingsMixin):
+class FilterBase(models.Model):
"""One specific trigger of a list."""
content = models.CharField(max_length=100, help_text="The definition of this filter.")
@@ -139,6 +132,47 @@ class FilterBase(FilterSettingsMixin):
FilterList, models.CASCADE, related_name="filters",
help_text="The filter list containing this filter."
)
+ dm_content = models.CharField(
+ max_length=1000,
+ null=True,
+ blank=True,
+ help_text="The DM to send to a user triggering this filter."
+ )
+ dm_embed = models.CharField(
+ max_length=2000,
+ help_text="The content of the DM embed",
+ null=True,
+ blank=True
+ )
+ infraction_type = models.CharField(
+ choices=[
+ (choices[0].upper(), choices[1])
+ for choices in [("NONE", "None"), *Infraction.TYPE_CHOICES]
+ ],
+ max_length=10,
+ null=True,
+ help_text="The infraction to apply to this user."
+ )
+ infraction_reason = models.CharField(
+ max_length=1000,
+ help_text="The reason to give for the infraction.",
+ blank=True,
+ null=True
+ )
+ infraction_duration = models.DurationField(
+ 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
+ )
guild_pings = ArrayField(
models.CharField(max_length=100),
help_text="Who to ping when this filter triggers.",
diff --git a/pydis_site/apps/api/serializers.py b/pydis_site/apps/api/serializers.py
index aac8d06e..a902523e 100644
--- a/pydis_site/apps/api/serializers.py
+++ b/pydis_site/apps/api/serializers.py
@@ -144,8 +144,13 @@ class DocumentationLinkSerializer(ModelSerializer):
# region: filters serializers
-
-REQUIRED_FOR_FILTER_LIST_SETTINGS = (
+SETTINGS_FIELDS = (
+ 'dm_content',
+ 'dm_embed',
+ 'infraction_type',
+ 'infraction_reason',
+ 'infraction_duration',
+ 'infraction_channel',
'guild_pings',
'filter_dm',
'dm_pings',
@@ -159,19 +164,9 @@ REQUIRED_FOR_FILTER_LIST_SETTINGS = (
'disabled_categories',
)
-OPTIONAL_FOR_FILTER_LIST_SETTINGS = (
- 'dm_content',
- 'dm_embed',
- 'infraction_type',
- 'infraction_reason',
- 'infraction_duration',
- 'infraction_channel',
-)
-
ALLOW_BLANK_SETTINGS = (
'dm_content',
'dm_embed',
- 'infraction_type',
'infraction_reason',
)
@@ -211,8 +206,6 @@ CHANNEL_SCOPE_FIELDS = (
)
MENTIONS_FIELDS = ("guild_pings", "dm_pings")
-SETTINGS_FIELDS = REQUIRED_FOR_FILTER_LIST_SETTINGS + OPTIONAL_FOR_FILTER_LIST_SETTINGS
-
def _create_filter_meta_extra_kwargs() -> dict[str, dict[str, bool]]:
"""Create the extra kwargs of the Filter serializer's Meta class."""
@@ -296,8 +289,6 @@ def _create_filter_list_meta_extra_kwargs() -> dict[str, dict[str, bool]]:
extra_kwargs = {}
for field in SETTINGS_FIELDS:
field_args = {}
- if field in OPTIONAL_FOR_FILTER_LIST_SETTINGS:
- field_args = {'required': False, 'allow_null': True}
if field in ALLOW_BLANK_SETTINGS:
field_args['allow_blank'] = True
if field in ALLOW_EMPTY_SETTINGS: