Skip to content

Commit 48550ac

Browse files
authored
Merge pull request #689 from python-discord/pr/aoc
Add support for storing AoC related data in site
2 parents 60200a0 + 57ece32 commit 48550ac

File tree

11 files changed

+263
-0
lines changed

11 files changed

+263
-0
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# Generated by Django 3.1.14 on 2022-03-06 16:07
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
import pydis_site.apps.api.models.mixins
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
('api', '0079_merge_20220125_2022'),
12+
]
13+
14+
operations = [
15+
migrations.CreateModel(
16+
name='AocAccountLink',
17+
fields=[
18+
('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')),
19+
('aoc_username', models.CharField(help_text='The AoC username associated with the Discord User.', max_length=120)),
20+
],
21+
bases=(pydis_site.apps.api.models.mixins.ModelReprMixin, models.Model),
22+
),
23+
migrations.CreateModel(
24+
name='AocCompletionistBlock',
25+
fields=[
26+
('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')),
27+
('is_blocked', models.BooleanField(default=True, help_text='Whether this user is actively being blocked from getting the AoC Completionist Role', verbose_name='Blocked')),
28+
('reason', models.TextField(help_text='The reason for the AoC Completionist Role Block.', null=True)),
29+
],
30+
bases=(pydis_site.apps.api.models.mixins.ModelReprMixin, models.Model),
31+
),
32+
]

pydis_site/apps/api/models/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
Nomination,
1111
NominationEntry,
1212
OffensiveMessage,
13+
AocAccountLink,
14+
AocCompletionistBlock,
1315
OffTopicChannelName,
1416
Reminder,
1517
Role,

pydis_site/apps/api/models/bot/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
from .documentation_link import DocumentationLink
66
from .infraction import Infraction
77
from .message import Message
8+
from .aoc_completionist_block import AocCompletionistBlock
9+
from .aoc_link import AocAccountLink
810
from .message_deletion_context import MessageDeletionContext
911
from .nomination import Nomination, NominationEntry
1012
from .off_topic_channel_name import OffTopicChannelName
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from django.db import models
2+
3+
from pydis_site.apps.api.models.bot.user import User
4+
from pydis_site.apps.api.models.mixins import ModelReprMixin
5+
6+
7+
class AocCompletionistBlock(ModelReprMixin, models.Model):
8+
"""A Discord user blocked from getting the AoC completionist Role."""
9+
10+
user = models.OneToOneField(
11+
User,
12+
on_delete=models.CASCADE,
13+
help_text="The user that is blocked from getting the AoC Completionist Role",
14+
primary_key=True
15+
)
16+
17+
is_blocked = models.BooleanField(
18+
default=True,
19+
help_text="Whether this user is actively being blocked "
20+
"from getting the AoC Completionist Role",
21+
verbose_name="Blocked"
22+
)
23+
reason = models.TextField(
24+
null=True,
25+
help_text="The reason for the AoC Completionist Role Block."
26+
)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from django.db import models
2+
3+
from pydis_site.apps.api.models.bot.user import User
4+
from pydis_site.apps.api.models.mixins import ModelReprMixin
5+
6+
7+
class AocAccountLink(ModelReprMixin, models.Model):
8+
"""An AoC account link for a Discord User."""
9+
10+
user = models.OneToOneField(
11+
User,
12+
on_delete=models.CASCADE,
13+
help_text="The user that is blocked from getting the AoC Completionist Role",
14+
primary_key=True
15+
)
16+
17+
aoc_username = models.CharField(
18+
max_length=120,
19+
help_text="The AoC username associated with the Discord User.",
20+
blank=False
21+
)

pydis_site/apps/api/serializers.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
from rest_framework.validators import UniqueTogetherValidator
1414

1515
from .models import (
16+
AocAccountLink,
17+
AocCompletionistBlock,
1618
BotSetting,
1719
DeletedMessage,
1820
DocumentationLink,
@@ -250,6 +252,26 @@ class Meta:
250252
)
251253

252254

255+
class AocCompletionistBlockSerializer(ModelSerializer):
256+
"""A class providing (de-)serialization of `AocCompletionistBlock` instances."""
257+
258+
class Meta:
259+
"""Metadata defined for the Django REST Framework."""
260+
261+
model = AocCompletionistBlock
262+
fields = ("user", "is_blocked", "reason")
263+
264+
265+
class AocAccountLinkSerializer(ModelSerializer):
266+
"""A class providing (de-)serialization of `AocAccountLink` instances."""
267+
268+
class Meta:
269+
"""Metadata defined for the Django REST Framework."""
270+
271+
model = AocAccountLink
272+
fields = ("user", "aoc_username")
273+
274+
253275
class RoleSerializer(ModelSerializer):
254276
"""A class providing (de-)serialization of `Role` instances."""
255277

pydis_site/apps/api/urls.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
from .views import HealthcheckView, RulesView
55
from .viewsets import (
6+
AocAccountLinkViewSet,
7+
AocCompletionistBlockViewSet,
68
BotSettingViewSet,
79
DeletedMessageViewSet,
810
DocumentationLinkViewSet,
@@ -34,6 +36,14 @@
3436
'documentation-links',
3537
DocumentationLinkViewSet
3638
)
39+
bot_router.register(
40+
"aoc-account-links",
41+
AocAccountLinkViewSet
42+
)
43+
bot_router.register(
44+
"aoc-completionist-blocks",
45+
AocCompletionistBlockViewSet
46+
)
3747
bot_router.register(
3848
'infractions',
3949
InfractionViewSet

pydis_site/apps/api/viewsets/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
InfractionViewSet,
88
NominationViewSet,
99
OffensiveMessageViewSet,
10+
AocAccountLinkViewSet,
11+
AocCompletionistBlockViewSet,
1012
OffTopicChannelNameViewSet,
1113
ReminderViewSet,
1214
RoleViewSet,

pydis_site/apps/api/viewsets/bot/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
from .nomination import NominationViewSet
88
from .off_topic_channel_name import OffTopicChannelNameViewSet
99
from .offensive_message import OffensiveMessageViewSet
10+
from .aoc_link import AocAccountLinkViewSet
11+
from .aoc_completionist_block import AocCompletionistBlockViewSet
1012
from .reminder import ReminderViewSet
1113
from .role import RoleViewSet
1214
from .user import UserViewSet
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
from django_filters.rest_framework import DjangoFilterBackend
2+
from rest_framework.mixins import (
3+
CreateModelMixin, DestroyModelMixin, ListModelMixin, RetrieveModelMixin
4+
)
5+
from rest_framework.viewsets import GenericViewSet
6+
7+
from pydis_site.apps.api.models.bot import AocCompletionistBlock
8+
from pydis_site.apps.api.serializers import AocCompletionistBlockSerializer
9+
10+
11+
class AocCompletionistBlockViewSet(
12+
GenericViewSet, CreateModelMixin, DestroyModelMixin, RetrieveModelMixin, ListModelMixin
13+
):
14+
"""
15+
View providing management for Users blocked from gettign the AoC completionist Role.
16+
17+
## Routes
18+
19+
### GET /bot/aoc-completionist-blocks/
20+
Returns all the AoC completionist blocks
21+
22+
#### Response format
23+
>>> [
24+
... {
25+
... "user": 2,
26+
... "is_blocked": False,
27+
... "reason": "Too good to be true"
28+
... }
29+
... ]
30+
31+
32+
### GET /bot/aoc-completionist-blocks/<user__id:int>
33+
Retrieve a single Block by User ID
34+
35+
#### Response format
36+
>>>
37+
... {
38+
... "user": 2,
39+
... "is_blocked": False,
40+
... "reason": "Too good to be true"
41+
... }
42+
43+
#### Status codes
44+
- 200: returned on success
45+
- 404: returned if an AoC completionist block with the given `user__id` was not found.
46+
47+
### POST /bot/aoc-completionist-blocks
48+
Adds a single AoC completionist block
49+
50+
#### Request body
51+
>>> {
52+
... "user": int,
53+
... "is_blocked": bool,
54+
... "reason": string
55+
... }
56+
57+
#### Status codes
58+
- 204: returned on success
59+
- 400: if one of the given fields is invalid
60+
61+
### DELETE /bot/aoc-completionist-blocks/<user__id:int>
62+
Deletes the AoC Completionist block item with the given `user__id`.
63+
64+
#### Status codes
65+
- 204: returned on success
66+
- 404: returned if the AoC Completionist block with the given `user__id` was not found
67+
68+
"""
69+
70+
serializer_class = AocCompletionistBlockSerializer
71+
queryset = AocCompletionistBlock.objects.all()
72+
filter_backends = (DjangoFilterBackend,)
73+
filter_fields = ("user__id", "is_blocked")

0 commit comments

Comments
 (0)