Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
1f4beeb
Rename utils.py to mixins.py. More precise.
Jul 14, 2020
a9fb4ac
Add a mixin for adding created and updated times.
Jul 14, 2020
ee743f6
Add the AllowList model and serializer.
Jul 14, 2020
0f99bf9
Merge branch 'master' into whitelist_system
Jul 15, 2020
cb5416b
Allowlist viewset.
Jul 15, 2020
0a73c2a
Minor fixes for imports and __init__ files.
Jul 15, 2020
d03ac5f
Set up url forwarding for the viewset.
Jul 15, 2020
787b317
Add a migration for the new AllowList model.
Jul 15, 2020
e8a32c7
Add a UniqueConstraint to prevent duplicates.
Jul 15, 2020
90f325f
Return id from the AllowListSerializer.
Jul 15, 2020
4470afc
Fix a bug in an old migration.
Jul 16, 2020
e3c750a
Add tests for the AllowList model.
Jul 16, 2020
ce3d207
Improve some docstrings.
Jul 16, 2020
e2aabf6
Fix some broken tests.
Jul 16, 2020
76cd687
Rename AllowList to AllowDenyList.
Jul 16, 2020
f596c4a
100% coverage for account.py
Jul 16, 2020
1fc9034
100% branch coverage for account.py
Jul 16, 2020
a3033a6
Merge branch 'master' into whitelist_system
lemonsaurus Jul 16, 2020
061ace4
Add an endpoint for getting AllowDenyList types.
Jul 17, 2020
8874a83
Add another AllowDenyList field, 'comment'.
Jul 19, 2020
74ef6fe
Simplify AllowDenyListType names.
Jul 19, 2020
7f00c53
Relock with a newer version of pipenv
Jul 19, 2020
53e4dfe
Document the get_types endpoint.
Jul 19, 2020
99fc3cd
Minor changes to tests, use subTest.
Jul 19, 2020
285c81b
Rename AllowDenyList to FilterList
Jul 27, 2020
0d7c95a
Handle unique validator in DRF, not Django.
Jul 29, 2020
b4b99c5
Add a test for checking duplicates.
Jul 29, 2020
676fb98
Merge branch 'master' into whitelist_system
Jul 29, 2020
f15a345
Fix multiple leafs for migration graph.
Jul 29, 2020
12f447b
Add a constraint in the DB model as well.
Jul 29, 2020
82f2297
Provide callable, not return value.
lemonsaurus Jul 30, 2020
322004e
Add a migration for all the existing data.
Jul 30, 2020
de89a3c
Delete FilterList objects for tests.
Jul 30, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions Pipfile.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion pydis_site/apps/api/migrations/0007_tag.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,6 @@ class Migration(migrations.Migration):
('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=(pydis_site.apps.api.models.ModelReprMixin, models.Model),
bases=(pydis_site.apps.api.models.mixins.ModelReprMixin, models.Model),
),
]
2 changes: 1 addition & 1 deletion pydis_site/apps/api/migrations/0009_snakefact.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,6 @@ class Migration(migrations.Migration):
fields=[
('fact', models.CharField(help_text='A fact about snakes.', max_length=200, primary_key=True, serialize=False)),
],
bases=(pydis_site.apps.api.models.ModelReprMixin, models.Model),
bases=(pydis_site.apps.api.models.mixins.ModelReprMixin, models.Model),
),
]
2 changes: 1 addition & 1 deletion pydis_site/apps/api/migrations/0010_snakeidiom.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,6 @@ class Migration(migrations.Migration):
fields=[
('idiom', models.CharField(help_text='A snake idiom', max_length=140, primary_key=True, serialize=False)),
],
bases=(pydis_site.apps.api.models.ModelReprMixin, models.Model),
bases=(pydis_site.apps.api.models.mixins.ModelReprMixin, models.Model),
),
]
2 changes: 1 addition & 1 deletion pydis_site/apps/api/migrations/0012_specialsnake.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,6 @@ class Migration(migrations.Migration):
('name', models.CharField(max_length=140, primary_key=True, serialize=False)),
('info', models.TextField()),
],
bases=(pydis_site.apps.api.models.ModelReprMixin, models.Model),
bases=(pydis_site.apps.api.models.mixins.ModelReprMixin, models.Model),
),
]
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@ class Migration(migrations.Migration):
('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=(pydis_site.apps.api.models.ModelReprMixin, models.Model),
bases=(pydis_site.apps.api.models.mixins.ModelReprMixin, models.Model),
),
]
2 changes: 1 addition & 1 deletion pydis_site/apps/api/migrations/0019_deletedmessage.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,6 @@ class Migration(migrations.Migration):
options={
'abstract': False,
},
bases=(pydis_site.apps.api.models.ModelReprMixin, models.Model),
bases=(pydis_site.apps.api.models.mixins.ModelReprMixin, models.Model),
),
]
2 changes: 1 addition & 1 deletion pydis_site/apps/api/migrations/0020_infraction.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,6 @@ class Migration(migrations.Migration):
('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=(pydis_site.apps.api.models.ModelReprMixin, models.Model),
bases=(pydis_site.apps.api.models.mixins.ModelReprMixin, models.Model),
),
]
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Generated by Django 2.1.4 on 2019-01-06 16:01

import datetime
from django.db import migrations, models
from django.utils import timezone


class Migration(migrations.Migration):
Expand All @@ -14,6 +14,6 @@ class Migration(migrations.Migration):
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.'),
field=models.DateTimeField(default=timezone.now, help_text='The date and time of the creation of this infraction.'),
),
]
2 changes: 1 addition & 1 deletion pydis_site/apps/api/migrations/0030_reminder.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,6 @@ class Migration(migrations.Migration):
('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=(pydis_site.apps.api.models.ModelReprMixin, models.Model),
bases=(pydis_site.apps.api.models.mixins.ModelReprMixin, models.Model),
),
]
2 changes: 1 addition & 1 deletion pydis_site/apps/api/migrations/0031_nomination.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,6 @@ class Migration(migrations.Migration):
('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=(pydis_site.apps.api.models.ModelReprMixin, models.Model),
bases=(pydis_site.apps.api.models.mixins.ModelReprMixin, models.Model),
),
]
2 changes: 1 addition & 1 deletion pydis_site/apps/api/migrations/0032_botsetting.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,6 @@ class Migration(migrations.Migration):
('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=(pydis_site.apps.api.models.ModelReprMixin, models.Model),
bases=(pydis_site.apps.api.models.mixins.ModelReprMixin, models.Model),
),
]
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,6 @@ class Migration(migrations.Migration):
('line', models.PositiveSmallIntegerField(help_text='The line at which the log line was emitted.')),
('message', models.TextField(help_text='The textual content of the log line.')),
],
bases=(pydis_site.apps.api.models.ModelReprMixin, models.Model),
bases=(pydis_site.apps.api.models.mixins.ModelReprMixin, models.Model),
),
]
4 changes: 2 additions & 2 deletions pydis_site/apps/api/migrations/0049_offensivemessage.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import django.core.validators
from django.db import migrations, models
import pydis_site.apps.api.models.bot.offensive_message
import pydis_site.apps.api.models.utils
import pydis_site.apps.api.models.mixins


class Migration(migrations.Migration):
Expand All @@ -20,6 +20,6 @@ class Migration(migrations.Migration):
('channel_id', models.BigIntegerField(help_text='The channel ID that the message was sent in, taken from Discord.', validators=[django.core.validators.MinValueValidator(limit_value=0, message='Channel IDs cannot be negative.')])),
('delete_date', models.DateTimeField(help_text='The date on which the message will be auto-deleted.', validators=[pydis_site.apps.api.models.bot.offensive_message.future_date_validator])),
],
bases=(pydis_site.apps.api.models.utils.ModelReprMixin, models.Model),
bases=(pydis_site.apps.api.models.mixins.ModelReprMixin, models.Model),
),
]
33 changes: 33 additions & 0 deletions pydis_site/apps/api/migrations/0058_create_new_filterlist_model.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Generated by Django 3.0.8 on 2020-07-15 11:23

from django.db import migrations, models
import pydis_site.apps.api.models.mixins


class Migration(migrations.Migration):
dependencies = [
('api', '0057_merge_20200716_0751'),
]

operations = [
migrations.CreateModel(
name='FilterList',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('type', models.CharField(
choices=[('GUILD_INVITE', 'Guild Invite'), ('FILE_FORMAT', 'File Format'),
('DOMAIN_NAME', 'Domain Name'), ('FILTER_TOKEN', 'Filter Token')],
help_text='The type of allowlist this is on.', max_length=50)),
('allowed', models.BooleanField(help_text='Whether this item is on the allowlist or the denylist.')),
('content', models.TextField(help_text='The data to add to the allow or denylist.')),
('comment', models.TextField(help_text="Optional comment on this entry.", null=True)),
],
bases=(pydis_site.apps.api.models.mixins.ModelReprMixin, models.Model),
),
migrations.AddConstraint(
model_name='filterlist',
constraint=models.UniqueConstraint(fields=('content', 'type'), name='unique_filter_list')
)
]
153 changes: 153 additions & 0 deletions pydis_site/apps/api/migrations/0059_populate_filterlists.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
from django.db import migrations

guild_invite_whitelist = [
("discord.gg/python", "Python Discord", True),
("discord.gg/4JJdJKb", "RLBot", True),
("discord.gg/djPtTRJ", "Kivy", True),
("discord.gg/QXyegWe", "Pyglet", True),
("discord.gg/9XsucTT", "Panda3D", True),
("discord.gg/AP3rq2k", "PyWeek", True),
("discord.gg/vSPsP9t", "Microsoft Python", True),
("discord.gg/bRCvFy9", "Discord.js Official", True),
("discord.gg/9zT7NHP", "Programming Discussions", True),
("discord.gg/ysd6M4r", "JetBrains Community", True),
("discord.gg/4xJeCgy", "Raspberry Pie", True),
("discord.gg/AStb3kZ", "Ren'Py", True),
("discord.gg/t655QNV", "Python Discord: Emojis 1", True),
("discord.gg/vRZPkqC", "Python Discord: Emojis 2", True),
("discord.gg/jTtgWuy", "Django", True),
("discord.gg/W9BypZF", "STEM", True),
("discord.gg/dpy", "discord.py", True),
("discord.gg/programming", "Programmers Hangout", True),
("discord.gg/qhGUjGD", "SpeakJS", True),
("discord.gg/eTbWSZj", "Functional Programming", True),
("discord.gg/r8yreB6", "PyGame", True),
("discord.gg/5UBnR3P", "Python Atlanta", True),
("discord.gg/ccyrDKv", "C#", True),
]

domain_name_blacklist = [
("pornhub.com", None, False),
("liveleak.com", None, False),
("grabify.link", None, False),
("bmwforum.co", None, False),
("leancoding.co", None, False),
("spottyfly.com", None, False),
("stopify.co", None, False),
("yoütu.be", None, False),
("discörd.com", None, False),
("minecräft.com", None, False),
("freegiftcards.co", None, False),
("disçordapp.com", None, False),
("fortnight.space", None, False),
("fortnitechat.site", None, False),
("joinmy.site", None, False),
("curiouscat.club", None, False),
("catsnthings.fun", None, False),
("yourtube.site", None, False),
("youtubeshort.watch", None, False),
("catsnthing.com", None, False),
("youtubeshort.pro", None, False),
("canadianlumberjacks.online", None, False),
("poweredbydialup.club", None, False),
("poweredbydialup.online", None, False),
("poweredbysecurity.org", None, False),
("poweredbysecurity.online", None, False),
("ssteam.site", None, False),
("steamwalletgift.com", None, False),
("discord.gift", None, False),
("lmgtfy.com", None, False),
]

filter_token_blacklist = [
("\bgoo+ks*\b", None, False),
("\bky+s+\b", None, False),
("\bki+ke+s*\b", None, False),
("\bbeaner+s?\b", None, False),
("\bcoo+ns*\b", None, False),
("\bnig+lets*\b", None, False),
("\bslant-eyes*\b", None, False),
("\btowe?l-?head+s*\b", None, False),
("\bchi*n+k+s*\b", None, False),
("\bspick*s*\b", None, False),
("\bkill* +(?:yo)?urself+\b", None, False),
("\bjew+s*\b", None, False),
("\bsuicide\b", None, False),
("\brape\b", None, False),
("\b(re+)tar+(d+|t+)(ed)?\b", None, False),
("\bta+r+d+\b", None, False),
("\bcunts*\b", None, False),
("\btrann*y\b", None, False),
("\bshemale\b", None, False),
("fa+g+s*", None, False),
("卐", None, False),
("卍", None, False),
("࿖", None, False),
("࿕", None, False),
("࿘", None, False),
("࿗", None, False),
("cuck(?!oo+)", None, False),
("nigg+(?:e*r+|a+h*?|u+h+)s?", None, False),
("fag+o+t+s*", None, False),
]

file_format_whitelist = [
(".3gp", None, True),
(".3g2", None, True),
(".avi", None, True),
(".bmp", None, True),
(".gif", None, True),
(".h264", None, True),
(".jpg", None, True),
(".jpeg", None, True),
(".m4v", None, True),
(".mkv", None, True),
(".mov", None, True),
(".mp4", None, True),
(".mpeg", None, True),
(".mpg", None, True),
(".png", None, True),
(".tiff", None, True),
(".wmv", None, True),
(".svg", None, True),
(".psd", "Photoshop", True),
(".ai", "Illustrator", True),
(".aep", "After Effects", True),
(".xcf", "GIMP", True),
(".mp3", None, True),
(".wav", None, True),
(".ogg", None, True),
(".webm", None, True),
(".webp", None, True),
]

populate_data = {
"FILTER_TOKEN": filter_token_blacklist,
"DOMAIN_NAME": domain_name_blacklist,
"FILE_FORMAT": file_format_whitelist,
"GUILD_INVITE": guild_invite_whitelist,
}


class Migration(migrations.Migration):
dependencies = [("api", "0058_create_new_filterlist_model")]

def populate_filterlists(app, _):
FilterList = app.get_model("api", "FilterList")

for filterlist_type, metadata in populate_data.items():
for content, comment, allowed in metadata:
FilterList.objects.create(
type=filterlist_type,
allowed=allowed,
content=content,
comment=comment,
)

def clear_filterlists(app, _):
FilterList = app.get_model("api", "FilterList")
FilterList.objects.all().delete()

operations = [
migrations.RunPython(populate_filterlists, clear_filterlists)
]
2 changes: 1 addition & 1 deletion pydis_site/apps/api/models/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# flake8: noqa
from .bot import (
FilterList,
BotSetting,
DocumentationLink,
DeletedMessage,
Expand All @@ -15,4 +16,3 @@
User
)
from .log_entry import LogEntry
from .utils import ModelReprMixin
1 change: 1 addition & 0 deletions pydis_site/apps/api/models/bot/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# flake8: noqa
from .filter_list import FilterList
from .bot_setting import BotSetting
from .deleted_message import DeletedMessage
from .documentation_link import DocumentationLink
Expand Down
2 changes: 1 addition & 1 deletion pydis_site/apps/api/models/bot/bot_setting.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from django.core.exceptions import ValidationError
from django.db import models

from pydis_site.apps.api.models.utils import ModelReprMixin
from pydis_site.apps.api.models.mixins import ModelReprMixin


def validate_bot_setting_name(name: str) -> None:
Expand Down
2 changes: 1 addition & 1 deletion pydis_site/apps/api/models/bot/documentation_link.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from django.db import models

from pydis_site.apps.api.models.utils import ModelReprMixin
from pydis_site.apps.api.models.mixins import ModelReprMixin


class DocumentationLink(ModelReprMixin, models.Model):
Expand Down
Loading