aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Johannes Christ <[email protected]>2018-10-17 19:50:23 +0000
committerGravatar Johannes Christ <[email protected]>2018-10-17 19:50:23 +0000
commit7b0e0ce545238bfa21f710f983b595950a636b52 (patch)
tree66f92f9d6328e2ad4484bf412cebe3057af7056a
parentAdd `docker` tag to use proper runners. (diff)
parentMerge branch 'django' of https://gitlab.com/python-discord/projects/site into... (diff)
Merge branch 'snake_facts' into 'django'
Snake Facts API See merge request python-discord/projects/site!41
-rw-r--r--api/admin.py4
-rw-r--r--api/migrations/0009_snakefact.py21
-rw-r--r--api/models.py13
-rw-r--r--api/serializers.py9
-rw-r--r--api/tests/test_models.py3
-rw-r--r--api/urls.py6
-rw-r--r--api/viewsets.py33
7 files changed, 81 insertions, 8 deletions
diff --git a/api/admin.py b/api/admin.py
index 526bea52..1ce8d767 100644
--- a/api/admin.py
+++ b/api/admin.py
@@ -3,7 +3,8 @@ from django.contrib import admin
from .models import (
DocumentationLink, Member,
OffTopicChannelName, Role,
- SnakeName, Tag
+ SnakeFact, SnakeName,
+ Tag
)
@@ -11,5 +12,6 @@ admin.site.register(DocumentationLink)
admin.site.register(Member)
admin.site.register(OffTopicChannelName)
admin.site.register(Role)
+admin.site.register(SnakeFact)
admin.site.register(SnakeName)
admin.site.register(Tag)
diff --git a/api/migrations/0009_snakefact.py b/api/migrations/0009_snakefact.py
new file mode 100644
index 00000000..966478a9
--- /dev/null
+++ b/api/migrations/0009_snakefact.py
@@ -0,0 +1,21 @@
+# Generated by Django 2.1.2 on 2018-10-11 14:25
+
+import api.models
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('api', '0008_tag_embed_validator'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='SnakeFact',
+ fields=[
+ ('fact', models.CharField(help_text='A fact about snakes.', max_length=200, primary_key=True, serialize=False)),
+ ],
+ bases=(api.models.ModelReprMixin, models.Model),
+ ),
+ ]
diff --git a/api/models.py b/api/models.py
index e5ec7992..7c9b63f5 100644
--- a/api/models.py
+++ b/api/models.py
@@ -60,6 +60,19 @@ class OffTopicChannelName(ModelReprMixin, models.Model):
return self.name
+class SnakeFact(ModelReprMixin, models.Model):
+ """A snake fact used by the bot's snake cog."""
+
+ fact = models.CharField(
+ primary_key=True,
+ max_length=200,
+ help_text="A fact about snakes."
+ )
+
+ def __str__(self):
+ return self.fact
+
+
class SnakeName(ModelReprMixin, models.Model):
"""A snake name used by the bot's snake cog."""
diff --git a/api/serializers.py b/api/serializers.py
index c36cce5f..fe2ab2f1 100644
--- a/api/serializers.py
+++ b/api/serializers.py
@@ -4,7 +4,8 @@ from rest_framework_bulk import BulkSerializerMixin
from .models import (
DocumentationLink, Member,
OffTopicChannelName, Role,
- SnakeName, Tag
+ SnakeFact, SnakeName,
+ Tag
)
@@ -23,6 +24,12 @@ class OffTopicChannelNameSerializer(ModelSerializer):
return obj.name
+class SnakeFactSerializer(ModelSerializer):
+ class Meta:
+ model = SnakeFact
+ fields = ('fact',)
+
+
class SnakeNameSerializer(ModelSerializer):
class Meta:
model = SnakeName
diff --git a/api/tests/test_models.py b/api/tests/test_models.py
index 3cf828d6..55009bf6 100644
--- a/api/tests/test_models.py
+++ b/api/tests/test_models.py
@@ -2,7 +2,7 @@ from django.test import SimpleTestCase
from ..models import (
DocumentationLink, Member, ModelReprMixin,
- OffTopicChannelName, Role, SnakeName, Tag
+ OffTopicChannelName, Role, SnakeFact, SnakeName, Tag
)
@@ -27,6 +27,7 @@ class StringDunderMethodTests(SimpleTestCase):
'test', 'http://example.com', 'http://example.com'
),
OffTopicChannelName(name='bob-the-builders-playground'),
+ SnakeFact(fact='snakes are cute'),
SnakeName(name='python', scientific='3'),
Role(
id=5, name='test role',
diff --git a/api/urls.py b/api/urls.py
index 1648471c..40883c64 100644
--- a/api/urls.py
+++ b/api/urls.py
@@ -4,7 +4,7 @@ from rest_framework.routers import DefaultRouter
from .views import HealthcheckView
from .viewsets import (
DocumentationLinkViewSet, MemberViewSet,
- OffTopicChannelNameViewSet, SnakeNameViewSet,
+ OffTopicChannelNameViewSet, SnakeFactViewSet, SnakeNameViewSet,
TagViewSet
)
@@ -25,6 +25,10 @@ bot_router.register(
MemberViewSet
)
bot_router.register(
+ 'snake-facts',
+ SnakeFactViewSet,
+)
+bot_router.register(
'snake-names',
SnakeNameViewSet,
base_name='snakename'
diff --git a/api/viewsets.py b/api/viewsets.py
index e3fa219c..22862c16 100644
--- a/api/viewsets.py
+++ b/api/viewsets.py
@@ -11,13 +11,13 @@ from rest_framework_bulk import BulkCreateModelMixin
from .models import (
DocumentationLink, Member,
- OffTopicChannelName, SnakeName,
- Tag
+ OffTopicChannelName, SnakeFact,
+ SnakeName, Tag
)
from .serializers import (
DocumentationLinkSerializer, MemberSerializer,
- OffTopicChannelNameSerializer, SnakeNameSerializer,
- TagSerializer
+ OffTopicChannelNameSerializer, SnakeFactSerializer,
+ SnakeNameSerializer, TagSerializer
)
@@ -174,6 +174,31 @@ class OffTopicChannelNameViewSet(DestroyModelMixin, ViewSet):
return Response(serialized.data)
+class SnakeFactViewSet(ListModelMixin, GenericViewSet):
+ """
+ View providing snake facts created by the Pydis community in the first code jam.
+
+ ## Routes
+ ### GET /bot/snake-fact/<fact>
+ Returns a snake fact in the database.
+
+ #### Response format
+ >>> [
+ ... {'fact': 'Snakes are dangerous'},
+ ... {'fact': 'Except for Python, we all love it'}
+ ... ]
+
+ #### Status codes
+ - 200: returned on success
+
+ ## Authentication
+ Requires an API token.
+ """
+
+ serializer_class = SnakeFactSerializer
+ queryset = SnakeFact.objects.all()
+
+
class SnakeNameViewSet(ViewSet):
"""
View providing snake names for the bot's snake cog from our first code jam's winners.