diff options
Diffstat (limited to '')
| -rw-r--r-- | pydis_site/apps/api/migrations/0080_add_aoc_tables.py | 32 | ||||
| -rw-r--r-- | pydis_site/apps/api/models/__init__.py | 2 | ||||
| -rw-r--r-- | pydis_site/apps/api/models/bot/__init__.py | 2 | ||||
| -rw-r--r-- | pydis_site/apps/api/models/bot/aoc_completionist_block.py | 26 | ||||
| -rw-r--r-- | pydis_site/apps/api/models/bot/aoc_link.py | 21 | ||||
| -rw-r--r-- | pydis_site/apps/api/serializers.py | 22 | ||||
| -rw-r--r-- | pydis_site/apps/api/urls.py | 10 | ||||
| -rw-r--r-- | pydis_site/apps/api/viewsets/__init__.py | 2 | ||||
| -rw-r--r-- | pydis_site/apps/api/viewsets/bot/__init__.py | 2 | ||||
| -rw-r--r-- | pydis_site/apps/api/viewsets/bot/aoc_completionist_block.py | 73 | ||||
| -rw-r--r-- | pydis_site/apps/api/viewsets/bot/aoc_link.py | 71 | 
11 files changed, 263 insertions, 0 deletions
| diff --git a/pydis_site/apps/api/migrations/0080_add_aoc_tables.py b/pydis_site/apps/api/migrations/0080_add_aoc_tables.py new file mode 100644 index 00000000..2c0c689a --- /dev/null +++ b/pydis_site/apps/api/migrations/0080_add_aoc_tables.py @@ -0,0 +1,32 @@ +# Generated by Django 3.1.14 on 2022-03-06 16:07 + +from django.db import migrations, models +import django.db.models.deletion +import pydis_site.apps.api.models.mixins + + +class Migration(migrations.Migration): + +    dependencies = [ +        ('api', '0079_merge_20220125_2022'), +    ] + +    operations = [ +        migrations.CreateModel( +            name='AocAccountLink', +            fields=[ +                ('user', models.OneToOneField(help_text='The user that is blocked from getting the AoC Completionist Role', on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to='api.user')), +                ('aoc_username', models.CharField(help_text='The AoC username associated with the Discord User.', max_length=120)), +            ], +            bases=(pydis_site.apps.api.models.mixins.ModelReprMixin, models.Model), +        ), +        migrations.CreateModel( +            name='AocCompletionistBlock', +            fields=[ +                ('user', models.OneToOneField(help_text='The user that is blocked from getting the AoC Completionist Role', on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to='api.user')), +                ('is_blocked', models.BooleanField(default=True, help_text='Whether this user is actively being blocked from getting the AoC Completionist Role', verbose_name='Blocked')), +                ('reason', models.TextField(help_text='The reason for the AoC Completionist Role Block.', null=True)), +            ], +            bases=(pydis_site.apps.api.models.mixins.ModelReprMixin, models.Model), +        ), +    ] diff --git a/pydis_site/apps/api/models/__init__.py b/pydis_site/apps/api/models/__init__.py index fd5bf220..4f616986 100644 --- a/pydis_site/apps/api/models/__init__.py +++ b/pydis_site/apps/api/models/__init__.py @@ -10,6 +10,8 @@ from .bot import (      Nomination,      NominationEntry,      OffensiveMessage, +    AocAccountLink, +    AocCompletionistBlock,      OffTopicChannelName,      Reminder,      Role, diff --git a/pydis_site/apps/api/models/bot/__init__.py b/pydis_site/apps/api/models/bot/__init__.py index ac864de3..ec0e701c 100644 --- a/pydis_site/apps/api/models/bot/__init__.py +++ b/pydis_site/apps/api/models/bot/__init__.py @@ -5,6 +5,8 @@ from .deleted_message import DeletedMessage  from .documentation_link import DocumentationLink  from .infraction import Infraction  from .message import Message +from .aoc_completionist_block import AocCompletionistBlock +from .aoc_link import AocAccountLink  from .message_deletion_context import MessageDeletionContext  from .nomination import Nomination, NominationEntry  from .off_topic_channel_name import OffTopicChannelName diff --git a/pydis_site/apps/api/models/bot/aoc_completionist_block.py b/pydis_site/apps/api/models/bot/aoc_completionist_block.py new file mode 100644 index 00000000..acbc0eba --- /dev/null +++ b/pydis_site/apps/api/models/bot/aoc_completionist_block.py @@ -0,0 +1,26 @@ +from django.db import models + +from pydis_site.apps.api.models.bot.user import User +from pydis_site.apps.api.models.mixins import ModelReprMixin + + +class AocCompletionistBlock(ModelReprMixin, models.Model): +    """A Discord user blocked from getting the AoC completionist Role.""" + +    user = models.OneToOneField( +        User, +        on_delete=models.CASCADE, +        help_text="The user that is blocked from getting the AoC Completionist Role", +        primary_key=True +    ) + +    is_blocked = models.BooleanField( +        default=True, +        help_text="Whether this user is actively being blocked " +                  "from getting the AoC Completionist Role", +        verbose_name="Blocked" +    ) +    reason = models.TextField( +        null=True, +        help_text="The reason for the AoC Completionist Role Block." +    ) diff --git a/pydis_site/apps/api/models/bot/aoc_link.py b/pydis_site/apps/api/models/bot/aoc_link.py new file mode 100644 index 00000000..4e9d4882 --- /dev/null +++ b/pydis_site/apps/api/models/bot/aoc_link.py @@ -0,0 +1,21 @@ +from django.db import models + +from pydis_site.apps.api.models.bot.user import User +from pydis_site.apps.api.models.mixins import ModelReprMixin + + +class AocAccountLink(ModelReprMixin, models.Model): +    """An AoC account link for a Discord User.""" + +    user = models.OneToOneField( +        User, +        on_delete=models.CASCADE, +        help_text="The user that is blocked from getting the AoC Completionist Role", +        primary_key=True +    ) + +    aoc_username = models.CharField( +        max_length=120, +        help_text="The AoC username associated with the Discord User.", +        blank=False +    ) diff --git a/pydis_site/apps/api/serializers.py b/pydis_site/apps/api/serializers.py index 745aff42..c97f7dba 100644 --- a/pydis_site/apps/api/serializers.py +++ b/pydis_site/apps/api/serializers.py @@ -13,6 +13,8 @@ from rest_framework.settings import api_settings  from rest_framework.validators import UniqueTogetherValidator  from .models import ( +    AocAccountLink, +    AocCompletionistBlock,      BotSetting,      DeletedMessage,      DocumentationLink, @@ -250,6 +252,26 @@ class ReminderSerializer(ModelSerializer):          ) +class AocCompletionistBlockSerializer(ModelSerializer): +    """A class providing (de-)serialization of `AocCompletionistBlock` instances.""" + +    class Meta: +        """Metadata defined for the Django REST Framework.""" + +        model = AocCompletionistBlock +        fields = ("user", "is_blocked", "reason") + + +class AocAccountLinkSerializer(ModelSerializer): +    """A class providing (de-)serialization of `AocAccountLink` instances.""" + +    class Meta: +        """Metadata defined for the Django REST Framework.""" + +        model = AocAccountLink +        fields = ("user", "aoc_username") + +  class RoleSerializer(ModelSerializer):      """A class providing (de-)serialization of `Role` instances.""" diff --git a/pydis_site/apps/api/urls.py b/pydis_site/apps/api/urls.py index b0ab545b..7c55fc92 100644 --- a/pydis_site/apps/api/urls.py +++ b/pydis_site/apps/api/urls.py @@ -3,6 +3,8 @@ from rest_framework.routers import DefaultRouter  from .views import HealthcheckView, RulesView  from .viewsets import ( +    AocAccountLinkViewSet, +    AocCompletionistBlockViewSet,      BotSettingViewSet,      DeletedMessageViewSet,      DocumentationLinkViewSet, @@ -35,6 +37,14 @@ bot_router.register(      DocumentationLinkViewSet  )  bot_router.register( +    "aoc-account-links", +    AocAccountLinkViewSet +) +bot_router.register( +    "aoc-completionist-blocks", +    AocCompletionistBlockViewSet +) +bot_router.register(      'infractions',      InfractionViewSet  ) diff --git a/pydis_site/apps/api/viewsets/__init__.py b/pydis_site/apps/api/viewsets/__init__.py index f133e77f..5fc1d64f 100644 --- a/pydis_site/apps/api/viewsets/__init__.py +++ b/pydis_site/apps/api/viewsets/__init__.py @@ -7,6 +7,8 @@ from .bot import (      InfractionViewSet,      NominationViewSet,      OffensiveMessageViewSet, +    AocAccountLinkViewSet, +    AocCompletionistBlockViewSet,      OffTopicChannelNameViewSet,      ReminderViewSet,      RoleViewSet, diff --git a/pydis_site/apps/api/viewsets/bot/__init__.py b/pydis_site/apps/api/viewsets/bot/__init__.py index 84b87eab..f1d84729 100644 --- a/pydis_site/apps/api/viewsets/bot/__init__.py +++ b/pydis_site/apps/api/viewsets/bot/__init__.py @@ -7,6 +7,8 @@ from .infraction import InfractionViewSet  from .nomination import NominationViewSet  from .off_topic_channel_name import OffTopicChannelNameViewSet  from .offensive_message import OffensiveMessageViewSet +from .aoc_link import AocAccountLinkViewSet +from .aoc_completionist_block import AocCompletionistBlockViewSet  from .reminder import ReminderViewSet  from .role import RoleViewSet  from .user import UserViewSet diff --git a/pydis_site/apps/api/viewsets/bot/aoc_completionist_block.py b/pydis_site/apps/api/viewsets/bot/aoc_completionist_block.py new file mode 100644 index 00000000..3a4cec60 --- /dev/null +++ b/pydis_site/apps/api/viewsets/bot/aoc_completionist_block.py @@ -0,0 +1,73 @@ +from django_filters.rest_framework import DjangoFilterBackend +from rest_framework.mixins import ( +    CreateModelMixin, DestroyModelMixin, ListModelMixin, RetrieveModelMixin +) +from rest_framework.viewsets import GenericViewSet + +from pydis_site.apps.api.models.bot import AocCompletionistBlock +from pydis_site.apps.api.serializers import AocCompletionistBlockSerializer + + +class AocCompletionistBlockViewSet( +    GenericViewSet, CreateModelMixin, DestroyModelMixin, RetrieveModelMixin, ListModelMixin +): +    """ +    View providing management for Users blocked from gettign the AoC completionist Role. + +    ## Routes + +    ### GET /bot/aoc-completionist-blocks/ +    Returns all the AoC completionist blocks + +    #### Response format +    >>> [ +    ...     { +    ...         "user": 2, +    ...         "is_blocked": False, +    ...         "reason": "Too good to be true" +    ...     } +    ... ] + + +    ### GET /bot/aoc-completionist-blocks/<user__id:int> +    Retrieve a single Block by User ID + +    #### Response format +    >>> +    ...     { +    ...         "user": 2, +    ...         "is_blocked": False, +    ...         "reason": "Too good to be true" +    ...     } + +    #### Status codes +    - 200: returned on success +    - 404: returned if an AoC completionist block with the given `user__id` was not found. + +    ### POST /bot/aoc-completionist-blocks +    Adds a single AoC completionist block + +    #### Request body +    >>> { +    ...     "user": int, +    ...     "is_blocked": bool, +    ...     "reason": string +    ... } + +    #### Status codes +    - 204: returned on success +    - 400: if one of the given fields is invalid + +    ### DELETE /bot/aoc-completionist-blocks/<user__id:int> +    Deletes the AoC Completionist block item with the given `user__id`. + +    #### Status codes +    - 204: returned on success +    - 404: returned if the AoC Completionist block with the given `user__id` was not found + +    """ + +    serializer_class = AocCompletionistBlockSerializer +    queryset = AocCompletionistBlock.objects.all() +    filter_backends = (DjangoFilterBackend,) +    filter_fields = ("user__id", "is_blocked") diff --git a/pydis_site/apps/api/viewsets/bot/aoc_link.py b/pydis_site/apps/api/viewsets/bot/aoc_link.py new file mode 100644 index 00000000..9f22c1a1 --- /dev/null +++ b/pydis_site/apps/api/viewsets/bot/aoc_link.py @@ -0,0 +1,71 @@ +from django_filters.rest_framework import DjangoFilterBackend +from rest_framework.mixins import ( +    CreateModelMixin, DestroyModelMixin, ListModelMixin, RetrieveModelMixin +) +from rest_framework.viewsets import GenericViewSet + +from pydis_site.apps.api.models.bot import AocAccountLink +from pydis_site.apps.api.serializers import AocAccountLinkSerializer + + +class AocAccountLinkViewSet( +    GenericViewSet, CreateModelMixin, DestroyModelMixin, RetrieveModelMixin, ListModelMixin +): +    """ +    View providing management for Users who linked their AoC accounts to their Discord Account. + +    ## Routes + +    ### GET /bot/aoc-account-links +    Returns all the AoC account links + +    #### Response format +    >>> [ +    ...     { +    ...         "user": 2, +    ...         "aoc_username": "AoCUser1" +    ...     }, +    ...     ... +    ... ] + + +    ### GET /bot/aoc-account-links/<user__id:int> +    Retrieve a AoC account link by User ID + +    #### Response format +    >>> +    ... { +    ...     "user": 2, +    ...     "aoc_username": "AoCUser1" +    ... } + +    #### Status codes +    - 200: returned on success +    - 404: returned if an AoC account link with the given `user__id` was not found. + +    ### POST /bot/aoc-account-links +    Adds a single AoC account link block + +    #### Request body +    >>> { +    ...     'user': int, +    ...     'aoc_username': str +    ... } + +    #### Status codes +    - 204: returned on success +    - 400: if one of the given fields was invalid + +    ### DELETE /bot/aoc-account-links/<user__id:int> +    Deletes the AoC account link item with the given `user__id`. + +    #### Status codes +    - 204: returned on success +    - 404: returned if the AoC account link with the given `user__id` was not found + +    """ + +    serializer_class = AocAccountLinkSerializer +    queryset = AocAccountLink.objects.all() +    filter_backends = (DjangoFilterBackend,) +    filter_fields = ("user__id",) | 
