diff options
| author | 2021-04-27 10:54:21 +0200 | |
|---|---|---|
| committer | 2021-12-18 18:01:28 +0100 | |
| commit | 64c5c617df68cc7b54fffbe8d76bb5c67d641c98 (patch) | |
| tree | 700be1fa0630dee2d538b17eb46679e660e2a273 /pydis_site | |
| parent | Filters: Add migration to the new model (diff) | |
Filters: hook the new models into the REST API
Diffstat (limited to 'pydis_site')
| -rw-r--r-- | pydis_site/apps/api/migrations/0070_new_filter_schema.py | 4 | ||||
| -rw-r--r-- | pydis_site/apps/api/models/bot/filters.py | 4 | ||||
| -rw-r--r-- | pydis_site/apps/api/serializers.py | 98 | ||||
| -rw-r--r-- | pydis_site/apps/api/urls.py | 29 | ||||
| -rw-r--r-- | pydis_site/apps/api/viewsets/__init__.py | 7 | ||||
| -rw-r--r-- | pydis_site/apps/api/viewsets/bot/__init__.py | 9 | ||||
| -rw-r--r-- | pydis_site/apps/api/viewsets/bot/filter_list.py | 98 | ||||
| -rw-r--r-- | pydis_site/apps/api/viewsets/bot/filters.py | 640 | 
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()  |