aboutsummaryrefslogtreecommitdiffstats
path: root/pydis_site/apps/api
diff options
context:
space:
mode:
authorGravatar Matteo Bertucci <[email protected]>2021-04-27 10:54:21 +0200
committerGravatar D0rs4n <[email protected]>2021-12-18 18:01:28 +0100
commit64c5c617df68cc7b54fffbe8d76bb5c67d641c98 (patch)
tree700be1fa0630dee2d538b17eb46679e660e2a273 /pydis_site/apps/api
parentFilters: Add migration to the new model (diff)
Filters: hook the new models into the REST API
Diffstat (limited to 'pydis_site/apps/api')
-rw-r--r--pydis_site/apps/api/migrations/0070_new_filter_schema.py4
-rw-r--r--pydis_site/apps/api/models/bot/filters.py4
-rw-r--r--pydis_site/apps/api/serializers.py98
-rw-r--r--pydis_site/apps/api/urls.py29
-rw-r--r--pydis_site/apps/api/viewsets/__init__.py7
-rw-r--r--pydis_site/apps/api/viewsets/bot/__init__.py9
-rw-r--r--pydis_site/apps/api/viewsets/bot/filter_list.py98
-rw-r--r--pydis_site/apps/api/viewsets/bot/filters.py640
8 files changed, 773 insertions, 116 deletions
diff --git a/pydis_site/apps/api/migrations/0070_new_filter_schema.py b/pydis_site/apps/api/migrations/0070_new_filter_schema.py
index e6d7ffe7..f4fc9494 100644
--- a/pydis_site/apps/api/migrations/0070_new_filter_schema.py
+++ b/pydis_site/apps/api/migrations/0070_new_filter_schema.py
@@ -132,8 +132,8 @@ class Migration(migrations.Migration):
('delete_messages', models.BooleanField(null=True)),
('bypass_roles', django.contrib.postgres.fields.ArrayField(base_field=models.IntegerField(), null=True, size=None)),
('enabled', models.BooleanField(null=True)),
- ('default_action', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='api.FilterAction')),
- ('default_range', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='api.ChannelRange')),
+ ('filter_action', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='api.FilterAction')),
+ ('filter_range', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='api.ChannelRange')),
],
),
migrations.CreateModel(
diff --git a/pydis_site/apps/api/models/bot/filters.py b/pydis_site/apps/api/models/bot/filters.py
index dfc38e82..16ac206e 100644
--- a/pydis_site/apps/api/models/bot/filters.py
+++ b/pydis_site/apps/api/models/bot/filters.py
@@ -183,5 +183,5 @@ class FilterOverride(models.Model):
delete_messages = models.BooleanField(null=True)
bypass_roles = ArrayField(models.IntegerField(), null=True)
enabled = models.BooleanField(null=True)
- default_action = models.ForeignKey("FilterAction", models.CASCADE, null=True)
- default_range = models.ForeignKey("ChannelRange", models.CASCADE, null=True)
+ filter_action = models.ForeignKey("FilterAction", models.CASCADE, null=True)
+ filter_range = models.ForeignKey("ChannelRange", models.CASCADE, null=True)
diff --git a/pydis_site/apps/api/serializers.py b/pydis_site/apps/api/serializers.py
index de2fccff..306dccb3 100644
--- a/pydis_site/apps/api/serializers.py
+++ b/pydis_site/apps/api/serializers.py
@@ -12,12 +12,17 @@ from rest_framework.serializers import (
from rest_framework.settings import api_settings
from rest_framework.validators import UniqueTogetherValidator
-from .models import (
+from .models import ( # noqa: I101 - Preserving the filter order
BotSetting,
DeletedMessage,
DocumentationLink,
- FilterList,
Infraction,
+ FilterList,
+ FilterSettings,
+ FilterAction,
+ ChannelRange,
+ Filter,
+ FilterOverride,
MessageDeletionContext,
Nomination,
NominationEntry,
@@ -119,24 +124,97 @@ class FilterListSerializer(ModelSerializer):
"""Metadata defined for the Django REST Framework."""
model = FilterList
- fields = ('id', 'created_at', 'updated_at', 'type', 'allowed', 'content', 'comment')
+ fields = ('id', 'name', 'list_type', 'filters', 'default_settings')
- # This validator ensures only one filterlist with the
- # same content can exist. This means that we cannot have both an allow
- # and a deny for the same item, and we cannot have duplicates of the
- # same item.
+ # Ensure that we can only have one filter list with the same name and field
validators = [
UniqueTogetherValidator(
queryset=FilterList.objects.all(),
- fields=['content', 'type'],
+ fields=('name', 'list_type'),
message=(
- "A filterlist for this item already exists. "
- "Please note that you cannot add the same item to both allow and deny."
+ "A filterlist with the same name and type already exist."
)
),
]
+class FilterSettingsSerializer(ModelSerializer):
+ """A class providing (de-)serialization of `FilterSettings` instances."""
+
+ class Meta:
+ """Metadata defined for the Django REST Framework."""
+
+ model = FilterSettings
+ fields = (
+ 'id',
+ 'ping_type',
+ 'filter_dm',
+ 'dm_ping_type',
+ 'delete_messages',
+ 'bypass_roles',
+ 'enabled',
+ 'default_action',
+ 'default_range'
+ )
+
+
+class FilterActionSerializer(ModelSerializer):
+ """A class providing (de-)serialization of `FilterAction` instances."""
+
+ class Meta:
+ """Metadata defined for the Django REST Framework."""
+
+ model = FilterAction
+ fields = ('id', 'user_dm', 'infraction_type', 'infraction_reason', 'infraction_duration')
+
+
+class FilterChannelRangeSerializer(ModelSerializer):
+ """A class providing (de-)serialization of `ChannelRange` instances."""
+
+ class Meta:
+ """Metadata defined for the Django REST Framework."""
+
+ model = ChannelRange
+ fields = (
+ 'id',
+ 'disallowed_channels',
+ 'disallowed_categories',
+ 'allowed_channels',
+ 'allowed_category',
+ 'default'
+ )
+
+
+class FilterSerializer(ModelSerializer):
+ """A class providing (de-)serialization of `Filter` instances."""
+
+ class Meta:
+ """Metadata defined for the Django REST Framework."""
+
+ model = Filter
+ fields = ('id', 'content', 'description', 'additional_field', 'override')
+
+
+class FilterOverrideSerializer(ModelSerializer):
+ """A class providing (de-)serialization of `FilterOverride` instances."""
+
+ class Meta:
+ """Metadata defined for the Django REST Framework."""
+
+ model = FilterOverride
+ fields = (
+ 'id',
+ 'ping_type',
+ 'filter_dm',
+ 'dm_ping_type',
+ 'delete_messages',
+ 'bypass_roles',
+ 'enabled',
+ 'filter_action',
+ 'filter_range'
+ )
+
+
class InfractionSerializer(ModelSerializer):
"""A class providing (de-)serialization of `Infraction` instances."""
diff --git a/pydis_site/apps/api/urls.py b/pydis_site/apps/api/urls.py
index b0ab545b..7af2e505 100644
--- a/pydis_site/apps/api/urls.py
+++ b/pydis_site/apps/api/urls.py
@@ -2,11 +2,16 @@ from django.urls import include, path
from rest_framework.routers import DefaultRouter
from .views import HealthcheckView, RulesView
-from .viewsets import (
+from .viewsets import ( # noqa: I101 - Preserving the filter order
BotSettingViewSet,
DeletedMessageViewSet,
DocumentationLinkViewSet,
FilterListViewSet,
+ FilterSettingsViewSet,
+ FilterActionViewSet,
+ FilterChannelRangeViewSet,
+ FilterViewSet,
+ FilterOverrideViewSet,
InfractionViewSet,
NominationViewSet,
OffTopicChannelNameViewSet,
@@ -19,10 +24,30 @@ from .viewsets import (
# https://www.django-rest-framework.org/api-guide/routers/#defaultrouter
bot_router = DefaultRouter(trailing_slash=False)
bot_router.register(
- 'filter-lists',
+ 'filter/filter_lists',
FilterListViewSet
)
bot_router.register(
+ 'filter/filter_settings',
+ FilterSettingsViewSet
+)
+bot_router.register(
+ 'filter/filter_action',
+ FilterActionViewSet
+)
+bot_router.register(
+ 'filter/channel_range',
+ FilterChannelRangeViewSet
+)
+bot_router.register(
+ 'filter/filter_override',
+ FilterOverrideViewSet
+)
+bot_router.register(
+ 'filter/filters',
+ FilterViewSet
+)
+bot_router.register(
'bot-settings',
BotSettingViewSet
)
diff --git a/pydis_site/apps/api/viewsets/__init__.py b/pydis_site/apps/api/viewsets/__init__.py
index f133e77f..b3992d66 100644
--- a/pydis_site/apps/api/viewsets/__init__.py
+++ b/pydis_site/apps/api/viewsets/__init__.py
@@ -1,10 +1,15 @@
# flake8: noqa
from .bot import (
- FilterListViewSet,
BotSettingViewSet,
DeletedMessageViewSet,
DocumentationLinkViewSet,
InfractionViewSet,
+ FilterListViewSet,
+ FilterSettingsViewSet,
+ FilterActionViewSet,
+ FilterChannelRangeViewSet,
+ FilterViewSet,
+ FilterOverrideViewSet,
NominationViewSet,
OffensiveMessageViewSet,
OffTopicChannelNameViewSet,
diff --git a/pydis_site/apps/api/viewsets/bot/__init__.py b/pydis_site/apps/api/viewsets/bot/__init__.py
index 84b87eab..781624bd 100644
--- a/pydis_site/apps/api/viewsets/bot/__init__.py
+++ b/pydis_site/apps/api/viewsets/bot/__init__.py
@@ -1,5 +1,12 @@
# flake8: noqa
-from .filter_list import FilterListViewSet
+from .filters import (
+ FilterListViewSet,
+ FilterSettingsViewSet,
+ FilterActionViewSet,
+ FilterChannelRangeViewSet,
+ FilterViewSet,
+ FilterOverrideViewSet
+)
from .bot_setting import BotSettingViewSet
from .deleted_message import DeletedMessageViewSet
from .documentation_link import DocumentationLinkViewSet
diff --git a/pydis_site/apps/api/viewsets/bot/filter_list.py b/pydis_site/apps/api/viewsets/bot/filter_list.py
deleted file mode 100644
index 3eacdaaa..00000000
--- a/pydis_site/apps/api/viewsets/bot/filter_list.py
+++ /dev/null
@@ -1,98 +0,0 @@
-from rest_framework.decorators import action
-from rest_framework.request import Request
-from rest_framework.response import Response
-from rest_framework.viewsets import ModelViewSet
-
-from pydis_site.apps.api.models.bot.filters import FilterList
-from pydis_site.apps.api.serializers import FilterListSerializer
-
-
-class FilterListViewSet(ModelViewSet):
- """
- View providing CRUD operations on items allowed or denied by our bot.
-
- ## Routes
- ### GET /bot/filter-lists
- Returns all filterlist items in the database.
-
- #### Response format
- >>> [
- ... {
- ... 'id': "2309268224",
- ... 'created_at': "01-01-2020 ...",
- ... 'updated_at': "01-01-2020 ...",
- ... 'type': "file_format",
- ... 'allowed': 'true',
- ... 'content': ".jpeg",
- ... 'comment': "Popular image format.",
- ... },
- ... ...
- ... ]
-
- #### Status codes
- - 200: returned on success
- - 401: returned if unauthenticated
-
- ### GET /bot/filter-lists/<id:int>
- Returns a specific FilterList item from the database.
-
- #### Response format
- >>> {
- ... 'id': "2309268224",
- ... 'created_at': "01-01-2020 ...",
- ... 'updated_at': "01-01-2020 ...",
- ... 'type': "file_format",
- ... 'allowed': 'true',
- ... 'content': ".jpeg",
- ... 'comment': "Popular image format.",
- ... }
-
- #### Status codes
- - 200: returned on success
- - 404: returned if the id was not found.
-
- ### GET /bot/filter-lists/get-types
- Returns a list of valid list types that can be used in POST requests.
-
- #### Response format
- >>> [
- ... ["GUILD_INVITE","Guild Invite"],
- ... ["FILE_FORMAT","File Format"],
- ... ["DOMAIN_NAME","Domain Name"],
- ... ["FILTER_TOKEN","Filter Token"],
- ... ["REDIRECT", "Redirect"]
- ... ]
-
- #### Status codes
- - 200: returned on success
-
- ### POST /bot/filter-lists
- Adds a single FilterList item to the database.
-
- #### Request body
- >>> {
- ... 'type': str,
- ... 'allowed': bool,
- ... 'content': str,
- ... 'comment': Optional[str],
- ... }
-
- #### Status codes
- - 201: returned on success
- - 400: if one of the given fields is invalid
-
- ### DELETE /bot/filter-lists/<id:int>
- Deletes the FilterList item with the given `id`.
-
- #### Status codes
- - 204: returned on success
- - 404: if a tag with the given `id` does not exist
- """
-
- serializer_class = FilterListSerializer
- queryset = FilterList.objects.all()
-
- @action(detail=False, url_path='get-types', methods=["get"])
- def get_types(self, _: Request) -> Response:
- """Get a list of all the types of FilterLists we support."""
- return Response(FilterList.FilterListType.choices)
diff --git a/pydis_site/apps/api/viewsets/bot/filters.py b/pydis_site/apps/api/viewsets/bot/filters.py
new file mode 100644
index 00000000..fea53265
--- /dev/null
+++ b/pydis_site/apps/api/viewsets/bot/filters.py
@@ -0,0 +1,640 @@
+from rest_framework.viewsets import ModelViewSet
+
+from pydis_site.apps.api.models.bot.filters import ( # noqa: I101 - Preserving the filter order
+ FilterList,
+ FilterSettings,
+ FilterAction,
+ ChannelRange,
+ Filter,
+ FilterOverride
+)
+from pydis_site.apps.api.serializers import ( # noqa: I101 - Preserving the filter order
+ FilterListSerializer,
+ FilterSettingsSerializer,
+ FilterActionSerializer,
+ FilterChannelRangeSerializer,
+ FilterSerializer,
+ FilterOverrideSerializer
+)
+
+
+class FilterListViewSet(ModelViewSet):
+ """
+ View providing CRUD operations on lists of items allowed or denied by our bot.
+
+ ## Routes
+ ### GET /bot/filter/filter_lists
+ Returns all FilterList items in the database.
+
+ #### Response format
+ >>> [
+ ... {
+ ... "id": 1,
+ ... "name": "guild_invite",
+ ... "list_type": 1,
+ ... "filters": [
+ ... 1,
+ ... 2,
+ ... ...
+ ... ],
+ ... "default_settings": 1
+ ... },
+ ... ...
+ ... ]
+
+ #### Status codes
+ - 200: returned on success
+ - 401: returned if unauthenticated
+
+ ### GET /bot/filter/filter_lists/<id:int>
+ Returns a specific FilterList item from the database.
+
+ #### Response format
+ >>> {
+ ... "id": 1,
+ ... "name": "guild_invite",
+ ... "list_type": 1,
+ ... "filters": [
+ ... 1,
+ ... 2,
+ ... ...
+ ... ],
+ ... "default_settings": 1
+ ... }
+
+ #### Status codes
+ - 200: returned on success
+ - 404: returned if the id was not found.
+
+ ### POST /bot/filter/filter_lists
+ Adds a single FilterList item to the database.
+
+ #### Request body
+ >>> {
+ ... "name": "guild_invite",
+ ... "list_type": 1,
+ ... "filters": [
+ ... 1,
+ ... 2,
+ ... ...
+ ... ],
+ ... "default_settings": 1
+ ... }
+
+ #### Status codes
+ - 201: returned on success
+ - 400: if one of the given fields is invalid
+
+ ### PATCH /bot/filter/filter_lists/<id:int>
+ Updates a specific FilterList item from the database.
+
+ #### Response format
+ >>> {
+ ... "id": 1,
+ ... "name": "guild_invite",
+ ... "list_type": 1,
+ ... "filters": [
+ ... 1,
+ ... 2,
+ ... ...
+ ... ],
+ ... "default_settings": 1
+ ... }
+
+ #### Status codes
+ - 200: returned on success
+ - 400: if one of the given fields is invalid
+
+ ### DELETE /bot/filter/filter_lists/<id:int>
+ Deletes the FilterList item with the given `id`.
+
+ #### Status codes
+ - 204: returned on success
+ - 404: if a tag with the given `id` does not exist
+ """
+
+ serializer_class = FilterListSerializer
+ queryset = FilterList.objects.all()
+
+
+class FilterSettingsViewSet(ModelViewSet):
+ """
+ View providing CRUD operations on settings of items allowed or denied by our bot.
+
+ ## Routes
+ ### GET /bot/filter/filter_settings
+ Returns all FilterSettings items in the database.
+
+ #### Response format
+ >>> [
+ ... {
+ ... "id": 1,
+ ... "ping_type": [
+ ... "onduty",
+ ... ...
+ ... ],
+ ... "filter_dm": True,
+ ... "dm_ping_type": [
+ ... "onduty",
+ ... ...
+ ... ],
+ ... "delete_messages": True,
+ ... "bypass_roles": [
+ ... 267630620367257601,
+ ... ...
+ ... ],
+ ... "enabled": True,
+ ... "default_action": 1,
+ ... "default_range": 1
+ ... },
+ ... ...
+ ... ]
+
+ #### Status codes
+ - 200: returned on success
+ - 401: returned if unauthenticated
+
+ ### GET /bot/filter/filter_settings/<id:int>
+ Returns a specific FilterSettings item from the database.
+
+ #### Response format
+ >>> {
+ ... "id": 1,
+ ... "ping_type": [
+ ... "onduty",
+ ... ...
+ ... ],
+ ... "filter_dm": True,
+ ... "dm_ping_type": [
+ ... "onduty",
+ ... ...
+ ... ],
+ ... "delete_messages": True,
+ ... "bypass_roles": [
+ ... 267630620367257601,
+ ... ...
+ ... ],
+ ... "enabled": True,
+ ... "default_action": 1,
+ ... "default_range": 1
+ ... }
+
+ #### Status codes
+ - 200: returned on success
+ - 404: returned if the id was not found.
+
+ ### POST /bot/filter/filter_settings
+ Adds a single FilterSettings item to the database.
+
+ #### Request body
+ >>> {
+ ... "ping_type": [
+ ... "onduty",
+ ... ...
+ ... ],
+ ... "filter_dm": True,
+ ... "dm_ping_type": [
+ ... "onduty",
+ ... ...
+ ... ],
+ ... "delete_messages": True,
+ ... "bypass_roles": [
+ ... 267630620367257601,
+ ... ...
+ ... ],
+ ... "enabled": True,
+ ... "default_action": 1,
+ ... "default_range": 1
+ ... }
+
+ #### Status codes
+ - 201: returned on success
+ - 400: if one of the given fields is invalid
+
+ ### PATCH /bot/filter/filter_settings/<id:int>
+ Updates a specific FilterSettings item from the database.
+
+ #### Response format
+ >>> {
+ ... "id": 1,
+ ... "ping_type": [
+ ... "onduty",
+ ... ...
+ ... ],
+ ... "filter_dm": True,
+ ... "dm_ping_type": [
+ ... "onduty",
+ ... ...
+ ... ],
+ ... "delete_messages": True,
+ ... "bypass_roles": [
+ ... 267630620367257601,
+ ... ...
+ ... ],
+ ... "enabled": True,
+ ... "default_action": 1,
+ ... "default_range": 1
+ ... }
+
+ #### Status codes
+ - 200: returned on success
+ - 400: if one of the given fields is invalid
+
+ ### DELETE /bot/filter/filter_settings/<id:int>
+ Deletes the FilterSettings item with the given `id`.
+
+ #### Status codes
+ - 204: returned on success
+ - 404: if a tag with the given `id` does not exist
+ """
+
+ serializer_class = FilterSettingsSerializer
+ queryset = FilterSettings.objects.all()
+
+
+class FilterActionViewSet(ModelViewSet):
+ """
+ View providing CRUD operations on actions taken by items allowed or denied by our bot.
+
+ ## Routes
+ ### GET /bot/filter/filter_action
+ Returns all FilterAction items in the database.
+
+ #### Response format
+ >>> [
+ ... {
+ ... "id": 1,
+ ... "user_dm": "message",
+ ... "infraction_type": "Warn",
+ ... "infraction_reason": "",
+ ... "infraction_duration": "01 12:34:56.123456"
+ ... },
+ ... ...
+ ... ]
+
+ #### Status codes
+ - 200: returned on success
+ - 401: returned if unauthenticated
+
+ ### GET /bot/filter/filter_action/<id:int>
+ Returns a specific FilterAction item from the database.
+
+ #### Response format
+ >>> {
+ ... "id": 1,
+ ... "user_dm": "message",
+ ... "infraction_type": "Warn",
+ ... "infraction_reason": "",
+ ... "infraction_duration": "01 12:34:56.123456"
+ ... }
+
+ #### Status codes
+ - 200: returned on success
+ - 404: returned if the id was not found.
+
+ ### POST /bot/filter/filter_action
+ Adds a single FilterAction item to the database.
+
+ #### Request body
+ >>> {
+ ... "user_dm": "message",
+ ... "infraction_type": "Warn",
+ ... "infraction_reason": "",
+ ... "infraction_duration": "01 12:34:56.123456"
+ ... }
+
+ #### Status codes
+ - 201: returned on success
+ - 400: if one of the given fields is invalid
+
+ ### PATCH /bot/filter/filter_action/<id:int>
+ Updates a specific FilterAction item from the database.
+
+ #### Response format
+ >>> {
+ ... "id": 1,
+ ... "user_dm": "message",
+ ... "infraction_type": "Warn",
+ ... "infraction_reason": "",
+ ... "infraction_duration": "01 12:34:56.123456"
+ ... }
+
+ #### Status codes
+ - 200: returned on success
+ - 400: if one of the given fields is invalid
+
+ ### DELETE /bot/filter/filter_action/<id:int>
+ Deletes the FilterAction item with the given `id`.
+
+ #### Status codes
+ - 204: returned on success
+ - 404: if a tag with the given `id` does not exist
+ """
+
+ serializer_class = FilterActionSerializer
+ queryset = FilterAction.objects.all()
+
+
+class FilterChannelRangeViewSet(ModelViewSet):
+ """
+ View providing CRUD operations on channels targeted by items allowed or denied by our bot.
+
+ ## Routes
+ ### GET /bot/filter/channel_range
+ Returns all ChannelRange items in the database.
+
+ #### Response format
+ >>> [
+ ... {
+ ... "id": 1,
+ ... "disallowed_channels": [],
+ ... "disallowed_categories": [],
+ ... "allowed_channels": [],
+ ... "allowed_category": [],
+ ... "default": True
+ ... },
+ ... ...
+ ... ]
+
+ #### Status codes
+ - 200: returned on success
+ - 401: returned if unauthenticated
+
+ ### GET /bot/filter/channel_range/<id:int>
+ Returns a specific ChannelRange item from the database.
+
+ #### Response format
+ >>> {
+ ... "id": 1,
+ ... "disallowed_channels": [],
+ ... "disallowed_categories": [],
+ ... "allowed_channels": [],
+ ... "allowed_category": [],
+ ... "default": True
+ ... }
+
+ #### Status codes
+ - 200: returned on success
+ - 404: returned if the id was not found.
+
+ ### POST /bot/filter/channel_range
+ Adds a single ChannelRange item to the database.
+
+ #### Request body
+ >>> {
+ ... "disallowed_channels": [],
+ ... "disallowed_categories": [],
+ ... "allowed_channels": [],
+ ... "allowed_category": [],
+ ... "default": True
+ ... }
+
+ #### Status codes
+ - 201: returned on success
+ - 400: if one of the given fields is invalid
+
+ ### PATCH /bot/filter/channel_range/<id:int>
+ Updates a specific ChannelRange item from the database.
+
+ #### Response format
+ >>> {
+ ... "id": 1,
+ ... "disallowed_channels": [],
+ ... "disallowed_categories": [],
+ ... "allowed_channels": [],
+ ... "allowed_category": [],
+ ... "default": True
+ ... }
+
+ #### Status codes
+ - 200: returned on success
+ - 400: if one of the given fields is invalid
+
+ ### DELETE /bot/filter/channel_range/<id:int>
+ Deletes the ChannelRange item with the given `id`.
+
+ #### Status codes
+ - 204: returned on success
+ - 404: if a tag with the given `id` does not exist
+ """
+
+ serializer_class = FilterChannelRangeSerializer
+ queryset = ChannelRange.objects.all()
+
+
+class FilterViewSet(ModelViewSet):
+ """
+ View providing CRUD operations on items allowed or denied by our bot.
+
+ ## Routes
+ ### GET /bot/filter/filters
+ Returns all Filter items in the database.
+
+ #### Response format
+ >>> [
+ ... {
+ ... "id": 1,
+ ... "content": "267624335836053506",
+ ... "description": "Python Discord",
+ ... "additional_field": None,
+ ... "override": 1
+ ... },
+ ... ...
+ ... ]
+
+ #### Status codes
+ - 200: returned on success
+ - 401: returned if unauthenticated
+
+ ### GET /bot/filter/filters/<id:int>
+ Returns a specific Filter item from the database.
+
+ #### Response format
+ >>> {
+ ... "id": 1,
+ ... "content": "267624335836053506",
+ ... "description": "Python Discord",
+ ... "additional_field": None,
+ ... "override": 1
+ ... }
+
+ #### Status codes
+ - 200: returned on success
+ - 404: returned if the id was not found.
+
+ ### POST /bot/filter/filters
+ Adds a single Filter item to the database.
+
+ #### Request body
+ >>> {
+ ... "content": "267624335836053506",
+ ... "description": "Python Discord",
+ ... "additional_field": None,
+ ... "override": 1
+ ... }
+
+ #### Status codes
+ - 201: returned on success
+ - 400: if one of the given fields is invalid
+
+ ### PATCH /bot/filter/filters/<id:int>
+ Updates a specific Filter item from the database.
+
+ #### Response format
+ >>> {
+ ... "id": 1,
+ ... "content": "267624335836053506",
+ ... "description": "Python Discord",
+ ... "additional_field": None,
+ ... "override": 1
+ ... }
+
+ #### Status codes
+ - 200: returned on success
+ - 400: if one of the given fields is invalid
+
+ ### DELETE /bot/filter/filters/<id:int>
+ Deletes the Filter item with the given `id`.
+
+ #### Status codes
+ - 204: returned on success
+ - 404: if a tag with the given `id` does not exist
+ """
+
+ serializer_class = FilterSerializer
+ queryset = Filter.objects.all()
+
+
+class FilterOverrideViewSet(ModelViewSet):
+ """
+ View providing CRUD operations setting overrides of items allowed or denied by our bot.
+
+ ## Routes
+ ### GET /bot/filter/filter_override
+ Returns all FilterOverride items in the database.
+
+ #### Response format
+ >>> [
+ ... {
+ ... "id": 1,
+ ... "ping_type": [
+ ... "onduty",
+ ... ...
+ ... ],
+ ... "filter_dm": True,
+ ... "dm_ping_type": [
+ ... "onduty",
+ ... ...
+ ... ],
+ ... "delete_messages": True,
+ ... "bypass_roles": [
+ ... 267630620367257601,
+ ... ...
+ ... ],
+ ... "enabled": True,
+ ... "filter_action": 1,
+ ... "filter_range": 1
+ ... },
+ ... ...
+ ... ]
+
+ #### Status codes
+ - 200: returned on success
+ - 401: returned if unauthenticated
+
+ ### GET /bot/filter/filter_override/<id:int>
+ Returns a specific FilterOverride item from the database.
+
+ #### Response format
+ >>> {
+ ... "id": 1,
+ ... "ping_type": [
+ ... "onduty",
+ ... ...
+ ... ],
+ ... "filter_dm": True,
+ ... "dm_ping_type": [
+ ... "onduty",
+ ... ...
+ ... ],
+ ... "delete_messages": True,
+ ... "bypass_roles": [
+ ... 267630620367257601,
+ ... ...
+ ... ],
+ ... "enabled": True,
+ ... "filter_action": 1,
+ ... "filter_range": 1
+ ... }
+
+ #### Status codes
+ - 200: returned on success
+ - 404: returned if the id was not found.
+
+ ### POST /bot/filter/filter_override
+ Adds a single FilterOverride item to the database.
+
+ #### Request body
+ >>> {
+ ... "ping_type": [
+ ... "onduty",
+ ... ...
+ ... ],
+ ... "filter_dm": True,
+ ... "dm_ping_type": [
+ ... "onduty",
+ ... ...
+ ... ],
+ ... "delete_messages": True,
+ ... "bypass_roles": [
+ ... 267630620367257601,
+ ... ...
+ ... ],
+ ... "enabled": True,
+ ... "filter_action": 1,
+ ... "filter_range": 1
+ ... }
+
+ #### Status codes
+ - 201: returned on success
+ - 400: if one of the given fields is invalid
+
+ ### PATCH /bot/filter/filter_override/<id:int>
+ Updates a specific FilterOverride item from the database.
+
+ #### Response format
+ >>> {
+ ... "id": 1,
+ ... "ping_type": [
+ ... "onduty",
+ ... ...
+ ... ],
+ ... "filter_dm": True,
+ ... "dm_ping_type": [
+ ... "onduty",
+ ... ...
+ ... ],
+ ... "delete_messages": True,
+ ... "bypass_roles": [
+ ... 267630620367257601,
+ ... ...
+ ... ],
+ ... "enabled": True,
+ ... "filter_action": 1,
+ ... "filter_range": 1
+ ... }
+
+ #### Status codes
+ - 200: returned on success
+ - 400: if one of the given fields is invalid
+
+ ### DELETE /bot/filter/filter_override/<id:int>
+ Deletes the FilterOverride item with the given `id`.
+
+ #### Status codes
+ - 204: returned on success
+ - 404: if a tag with the given `id` does not exist
+ """
+
+ serializer_class = FilterOverrideSerializer
+ queryset = FilterOverride.objects.all()