diff options
Diffstat (limited to 'pydis_site')
| -rw-r--r-- | pydis_site/apps/api/migrations/0046_offensivemessage.py | 25 | ||||
| -rw-r--r-- | pydis_site/apps/api/models/__init__.py | 1 | ||||
| -rw-r--r-- | pydis_site/apps/api/models/bot/__init__.py | 1 | ||||
| -rw-r--r-- | pydis_site/apps/api/models/bot/offensive_message.py | 44 | ||||
| -rw-r--r-- | pydis_site/apps/api/serializers.py | 11 | ||||
| -rw-r--r-- | pydis_site/apps/api/urls.py | 7 | ||||
| -rw-r--r-- | pydis_site/apps/api/viewsets/__init__.py | 1 | ||||
| -rw-r--r-- | pydis_site/apps/api/viewsets/bot/__init__.py | 1 | ||||
| -rw-r--r-- | pydis_site/apps/api/viewsets/bot/offensive_message.py | 66 | 
9 files changed, 156 insertions, 1 deletions
| diff --git a/pydis_site/apps/api/migrations/0046_offensivemessage.py b/pydis_site/apps/api/migrations/0046_offensivemessage.py new file mode 100644 index 00000000..0ce65946 --- /dev/null +++ b/pydis_site/apps/api/migrations/0046_offensivemessage.py @@ -0,0 +1,25 @@ +# Generated by Django 2.2.6 on 2019-10-24 17:57 + +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 + + +class Migration(migrations.Migration): + +    dependencies = [ +        ('api', '0045_add_plural_name_for_log_entry'), +    ] + +    operations = [ +        migrations.CreateModel( +            name='OffensiveMessage', +            fields=[ +                ('id', models.BigIntegerField(help_text='The message ID as taken from Discord.', primary_key=True, serialize=False, validators=[django.core.validators.MinValueValidator(limit_value=0, message='Message IDs cannot be negative.')])), +                ('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.DateField(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), +        ), +    ] diff --git a/pydis_site/apps/api/models/__init__.py b/pydis_site/apps/api/models/__init__.py index a4656bc3..450d18cd 100644 --- a/pydis_site/apps/api/models/__init__.py +++ b/pydis_site/apps/api/models/__init__.py @@ -7,6 +7,7 @@ from .bot import (      Message,      MessageDeletionContext,      Nomination, +    OffensiveMessage,      OffTopicChannelName,      Reminder,      Role, diff --git a/pydis_site/apps/api/models/bot/__init__.py b/pydis_site/apps/api/models/bot/__init__.py index 46219ea2..8ae47746 100644 --- a/pydis_site/apps/api/models/bot/__init__.py +++ b/pydis_site/apps/api/models/bot/__init__.py @@ -7,6 +7,7 @@ from .message import Message  from .message_deletion_context import MessageDeletionContext  from .nomination import Nomination  from .off_topic_channel_name import OffTopicChannelName +from .offensive_message import OffensiveMessage  from .reminder import Reminder  from .role import Role  from .tag import Tag diff --git a/pydis_site/apps/api/models/bot/offensive_message.py b/pydis_site/apps/api/models/bot/offensive_message.py new file mode 100644 index 00000000..523fd482 --- /dev/null +++ b/pydis_site/apps/api/models/bot/offensive_message.py @@ -0,0 +1,44 @@ +import datetime + +from django.core.exceptions import ValidationError +from django.core.validators import MinValueValidator +from django.db import models + +from pydis_site.apps.api.models.utils import ModelReprMixin + + +def future_date_validator(date: datetime.date) -> None: +    """Raise ValidationError if the date isn't a future date.""" +    if date < datetime.date.today(): +        raise ValidationError("Date must be a future date") + + +class OffensiveMessage(ModelReprMixin, models.Model): +    """A message that triggered a filter and that will be deleted one week after it was sent.""" + +    id = models.BigIntegerField( +        primary_key=True, +        help_text="The message ID as taken from Discord.", +        validators=( +            MinValueValidator( +                limit_value=0, +                message="Message IDs cannot be negative." +            ), +        ) +    ) +    channel_id = models.BigIntegerField( +        help_text=( +            "The channel ID that the message was " +            "sent in, taken from Discord." +        ), +        validators=( +            MinValueValidator( +                limit_value=0, +                message="Channel IDs cannot be negative." +            ), +        ) +    ) +    delete_date = models.DateField( +        help_text="The date on which the message will be auto-deleted.", +        validators=(future_date_validator,) +    ) diff --git a/pydis_site/apps/api/serializers.py b/pydis_site/apps/api/serializers.py index 326e20e1..4ef7ec78 100644 --- a/pydis_site/apps/api/serializers.py +++ b/pydis_site/apps/api/serializers.py @@ -8,6 +8,7 @@ from .models import (      DocumentationLink, Infraction,      LogEntry, MessageDeletionContext,      Nomination, OffTopicChannelName, +    OffensiveMessage,      Reminder, Role,      Tag, User  ) @@ -236,3 +237,13 @@ class NominationSerializer(ModelSerializer):          fields = (              'id', 'active', 'actor', 'reason', 'user',              'inserted_at', 'end_reason', 'ended_at') + + +class OffensiveMessageSerializer(ModelSerializer): +    """A class providing (de-)serialization of `OffensiveMessage` instances.""" + +    class Meta: +        """Metadata defined for the Django REST Framework.""" + +        model = OffensiveMessage +        fields = ('id', 'channel_id', 'delete_date') diff --git a/pydis_site/apps/api/urls.py b/pydis_site/apps/api/urls.py index ac6704c8..b1864ba7 100644 --- a/pydis_site/apps/api/urls.py +++ b/pydis_site/apps/api/urls.py @@ -6,7 +6,8 @@ from .viewsets import (      BotSettingViewSet, DeletedMessageViewSet,      DocumentationLinkViewSet, InfractionViewSet,      LogEntryViewSet, NominationViewSet, -    OffTopicChannelNameViewSet, ReminderViewSet, +    OffTopicChannelNameViewSet, +    OffensiveMessageViewSet, ReminderViewSet,      RoleViewSet, TagViewSet, UserViewSet  ) @@ -34,6 +35,10 @@ bot_router.register(      NominationViewSet  )  bot_router.register( +    'offensive-message', +    OffensiveMessageViewSet +) +bot_router.register(      'off-topic-channel-names',      OffTopicChannelNameViewSet,      base_name='offtopicchannelname' diff --git a/pydis_site/apps/api/viewsets/__init__.py b/pydis_site/apps/api/viewsets/__init__.py index f9a186d9..3cf9f641 100644 --- a/pydis_site/apps/api/viewsets/__init__.py +++ b/pydis_site/apps/api/viewsets/__init__.py @@ -5,6 +5,7 @@ from .bot import (      DocumentationLinkViewSet,      InfractionViewSet,      NominationViewSet, +    OffensiveMessageViewSet,      OffTopicChannelNameViewSet,      ReminderViewSet,      RoleViewSet, diff --git a/pydis_site/apps/api/viewsets/bot/__init__.py b/pydis_site/apps/api/viewsets/bot/__init__.py index f1851e32..b3e0fa4d 100644 --- a/pydis_site/apps/api/viewsets/bot/__init__.py +++ b/pydis_site/apps/api/viewsets/bot/__init__.py @@ -5,6 +5,7 @@ from .documentation_link import DocumentationLinkViewSet  from .infraction import InfractionViewSet  from .nomination import NominationViewSet  from .off_topic_channel_name import OffTopicChannelNameViewSet +from .offensive_message import OffensiveMessageViewSet  from .reminder import ReminderViewSet  from .role import RoleViewSet  from .tag import TagViewSet diff --git a/pydis_site/apps/api/viewsets/bot/offensive_message.py b/pydis_site/apps/api/viewsets/bot/offensive_message.py new file mode 100644 index 00000000..cd200efe --- /dev/null +++ b/pydis_site/apps/api/viewsets/bot/offensive_message.py @@ -0,0 +1,66 @@ +from django_filters.rest_framework import DjangoFilterBackend +from rest_framework.filters import SearchFilter +from rest_framework.mixins import ( +    CreateModelMixin, +    DestroyModelMixin, +    ListModelMixin, +    UpdateModelMixin +) +from rest_framework.viewsets import GenericViewSet + +from pydis_site.apps.api.models.bot.offensive_message import OffensiveMessage +from pydis_site.apps.api.serializers import OffensiveMessageSerializer + + +class OffensiveMessageViewSet( +    CreateModelMixin, ListModelMixin, DestroyModelMixin, UpdateModelMixin, GenericViewSet +): +    """ +    View providing CRUD access to reminders. + +    ## Routes +    ### GET /bot/offensive-message +    Returns all offensive messages in the database. + +    #### Response format +    >>> [ +    ...     { +    ...         'id': '631953598091100200', +    ...         'channel_id': '291284109232308226', +    ...         'delete_date': '2020-01-01' +    ...     }, +    ...     ... +    ... ] + +    #### Status codes +    - 200: returned on success + +    ### POST /bot/offensive-message +    Create a new offensive message object. + +    #### Request body +    >>> { +    ...     'id': int, +    ...     'channel_id': int, +    ...     'delete_date': datetime.date  # ISO-8601-formatted date +    ... } + +    #### Status codes +    - 201: returned on success +    - 400: if the body format is invalid + +    ### DELETE /bot/offensive-message/<id:int> +    Delete the offensive message object with the given `id`. + +    #### Status codes +    - 204: returned on success +    - 404: if a offensive message object with the given `id` does not exist + +    ## Authentication +    Requires an API token. +    """ + +    serializer_class = OffensiveMessageSerializer +    queryset = OffensiveMessage.objects.all() +    filter_backends = (DjangoFilterBackend, SearchFilter) +    filter_fields = ('delete_date',) | 
