From 2ae5f5205ec19dbc1574b6136da9479e080c6ba2 Mon Sep 17 00:00:00 2001 From: Hasan-Ahmad Date: Thu, 11 Oct 2018 16:14:34 +0100 Subject: Added snake facts api --- api/admin.py | 3 ++- api/migrations/0009_snakefact.py | 21 +++++++++++++++++++++ api/models.py | 13 +++++++++++++ api/serializers.py | 8 +++++++- api/urls.py | 6 +++++- api/viewsets.py | 29 +++++++++++++++++++++++++++-- 6 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 api/migrations/0009_snakefact.py (limited to 'api') diff --git a/api/admin.py b/api/admin.py index 526bea52..1d152b9e 100644 --- a/api/admin.py +++ b/api/admin.py @@ -3,7 +3,7 @@ from django.contrib import admin from .models import ( DocumentationLink, Member, OffTopicChannelName, Role, - SnakeName, Tag + SnakeName, Tag, SnakeFact, ) @@ -13,3 +13,4 @@ admin.site.register(OffTopicChannelName) admin.site.register(Role) admin.site.register(SnakeName) admin.site.register(Tag) +admin.site.register(SnakeFact) 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..32f978d4 100644 --- a/api/models.py +++ b/api/models.py @@ -77,6 +77,19 @@ class SnakeName(ModelReprMixin, models.Model): return f"{self.name} ({self.scientific})" +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 f"{self.fact}" + + class Role(ModelReprMixin, models.Model): """A role on our Discord server.""" diff --git a/api/serializers.py b/api/serializers.py index c36cce5f..900fa8b8 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -4,7 +4,7 @@ from rest_framework_bulk import BulkSerializerMixin from .models import ( DocumentationLink, Member, OffTopicChannelName, Role, - SnakeName, Tag + SnakeName, Tag, SnakeFact, ) @@ -29,6 +29,12 @@ class SnakeNameSerializer(ModelSerializer): fields = ('name', 'scientific') +class SnakeFactSerializer(ModelSerializer): + class Meta: + model = SnakeFact + fields = ('fact',) + + class RoleSerializer(ModelSerializer): class Meta: model = Role diff --git a/api/urls.py b/api/urls.py index 1648471c..38508d38 100644 --- a/api/urls.py +++ b/api/urls.py @@ -5,7 +5,7 @@ from .views import HealthcheckView from .viewsets import ( DocumentationLinkViewSet, MemberViewSet, OffTopicChannelNameViewSet, SnakeNameViewSet, - TagViewSet + TagViewSet, SnakeFactViewSet ) @@ -33,6 +33,10 @@ bot_router.register( 'tags', TagViewSet, ) +bot_router.register( + 'snake-fact', + SnakeFactViewSet, +) app_name = 'api' urlpatterns = ( diff --git a/api/viewsets.py b/api/viewsets.py index e3fa219c..29eb5782 100644 --- a/api/viewsets.py +++ b/api/viewsets.py @@ -12,12 +12,12 @@ from rest_framework_bulk import BulkCreateModelMixin from .models import ( DocumentationLink, Member, OffTopicChannelName, SnakeName, - Tag + Tag, SnakeFact, ) from .serializers import ( DocumentationLinkSerializer, MemberSerializer, OffTopicChannelNameSerializer, SnakeNameSerializer, - TagSerializer + TagSerializer, SnakeFactSerializer ) @@ -230,6 +230,31 @@ class SnakeNameViewSet(ViewSet): return Response({}) +class SnakeFactViewSet(RetrieveModelMixin, GenericViewSet): + """ + View providing snake facts created by the Pydis community in the first code jam. + + ## Routes + ### GET /bot/snake-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 TagViewSet(ModelViewSet): """ View providing CRUD operations on tags shown by our bot. -- cgit v1.2.3 From 833cc690736fc301303299b41e9e874b8e430983 Mon Sep 17 00:00:00 2001 From: Hasan-Ahmad Date: Sat, 13 Oct 2018 15:33:15 +0100 Subject: fixed ordering --- api/admin.py | 5 +++-- api/models.py | 26 +++++++++++++------------- api/serializers.py | 15 ++++++++------- api/urls.py | 8 ++++---- 4 files changed, 28 insertions(+), 26 deletions(-) (limited to 'api') diff --git a/api/admin.py b/api/admin.py index 1d152b9e..7d7cf6fb 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, + SnakeFact, SnakeName, + Tag, ) @@ -11,6 +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) -admin.site.register(SnakeFact) diff --git a/api/models.py b/api/models.py index 32f978d4..c37417eb 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 f"{self.fact}" + + class SnakeName(ModelReprMixin, models.Model): """A snake name used by the bot's snake cog.""" @@ -77,19 +90,6 @@ class SnakeName(ModelReprMixin, models.Model): return f"{self.name} ({self.scientific})" -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 f"{self.fact}" - - class Role(ModelReprMixin, models.Model): """A role on our Discord server.""" diff --git a/api/serializers.py b/api/serializers.py index 900fa8b8..a4482c30 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, + SnakeFact, SnakeName, + Tag, ) @@ -23,18 +24,18 @@ class OffTopicChannelNameSerializer(ModelSerializer): return obj.name -class SnakeNameSerializer(ModelSerializer): - class Meta: - model = SnakeName - fields = ('name', 'scientific') - - class SnakeFactSerializer(ModelSerializer): class Meta: model = SnakeFact fields = ('fact',) +class SnakeNameSerializer(ModelSerializer): + class Meta: + model = SnakeName + fields = ('name', 'scientific') + + class RoleSerializer(ModelSerializer): class Meta: model = Role diff --git a/api/urls.py b/api/urls.py index 38508d38..5cc1b346 100644 --- a/api/urls.py +++ b/api/urls.py @@ -24,6 +24,10 @@ bot_router.register( 'members', MemberViewSet ) +bot_router.register( + 'snake-facts', + SnakeFactViewSet, +) bot_router.register( 'snake-names', SnakeNameViewSet, @@ -33,10 +37,6 @@ bot_router.register( 'tags', TagViewSet, ) -bot_router.register( - 'snake-fact', - SnakeFactViewSet, -) app_name = 'api' urlpatterns = ( -- cgit v1.2.3 From 87cea3fb21f85bf43e53b4a65df827628cc2b2b5 Mon Sep 17 00:00:00 2001 From: Hasan-Ahmad Date: Sat, 13 Oct 2018 15:34:08 +0100 Subject: Fixed ordering, switched to ListModelMixin --- api/viewsets.py | 54 +++++++++++++++++++++++++++--------------------------- 1 file changed, 27 insertions(+), 27 deletions(-) (limited to 'api') diff --git a/api/viewsets.py b/api/viewsets.py index 29eb5782..4e36aa8e 100644 --- a/api/viewsets.py +++ b/api/viewsets.py @@ -12,12 +12,12 @@ from rest_framework_bulk import BulkCreateModelMixin from .models import ( DocumentationLink, Member, OffTopicChannelName, SnakeName, - Tag, SnakeFact, + SnakeFact, Tag, ) from .serializers import ( DocumentationLinkSerializer, MemberSerializer, OffTopicChannelNameSerializer, SnakeNameSerializer, - TagSerializer, SnakeFactSerializer + SnakeFactSerializer, 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/ + 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. @@ -230,31 +255,6 @@ class SnakeNameViewSet(ViewSet): return Response({}) -class SnakeFactViewSet(RetrieveModelMixin, GenericViewSet): - """ - View providing snake facts created by the Pydis community in the first code jam. - - ## Routes - ### GET /bot/snake-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 TagViewSet(ModelViewSet): """ View providing CRUD operations on tags shown by our bot. -- cgit v1.2.3 From e0298cdbd1f1a4fdd1963c93ea271cb52fb5c923 Mon Sep 17 00:00:00 2001 From: Hasan-Ahmad Date: Mon, 15 Oct 2018 21:45:21 +0100 Subject: Fixed import order and linting --- api/admin.py | 2 +- api/models.py | 2 +- api/serializers.py | 4 ++-- api/urls.py | 4 ++-- api/viewsets.py | 7 +++---- 5 files changed, 9 insertions(+), 10 deletions(-) (limited to 'api') diff --git a/api/admin.py b/api/admin.py index 7d7cf6fb..1ce8d767 100644 --- a/api/admin.py +++ b/api/admin.py @@ -4,7 +4,7 @@ from .models import ( DocumentationLink, Member, OffTopicChannelName, Role, SnakeFact, SnakeName, - Tag, + Tag ) diff --git a/api/models.py b/api/models.py index c37417eb..7c9b63f5 100644 --- a/api/models.py +++ b/api/models.py @@ -70,7 +70,7 @@ class SnakeFact(ModelReprMixin, models.Model): ) def __str__(self): - return f"{self.fact}" + return self.fact class SnakeName(ModelReprMixin, models.Model): diff --git a/api/serializers.py b/api/serializers.py index a4482c30..a0f823e9 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -4,8 +4,8 @@ from rest_framework_bulk import BulkSerializerMixin from .models import ( DocumentationLink, Member, OffTopicChannelName, Role, - SnakeFact, SnakeName, - Tag, + SnakeFact, SnakeName, + Tag, ) diff --git a/api/urls.py b/api/urls.py index 5cc1b346..40883c64 100644 --- a/api/urls.py +++ b/api/urls.py @@ -4,8 +4,8 @@ from rest_framework.routers import DefaultRouter from .views import HealthcheckView from .viewsets import ( DocumentationLinkViewSet, MemberViewSet, - OffTopicChannelNameViewSet, SnakeNameViewSet, - TagViewSet, SnakeFactViewSet + OffTopicChannelNameViewSet, SnakeFactViewSet, SnakeNameViewSet, + TagViewSet ) diff --git a/api/viewsets.py b/api/viewsets.py index 4e36aa8e..9edc2b69 100644 --- a/api/viewsets.py +++ b/api/viewsets.py @@ -11,13 +11,12 @@ from rest_framework_bulk import BulkCreateModelMixin from .models import ( DocumentationLink, Member, - OffTopicChannelName, SnakeName, - SnakeFact, Tag, + OffTopicChannelName, SnakeFact, SnakeName, Tag ) from .serializers import ( DocumentationLinkSerializer, MemberSerializer, - OffTopicChannelNameSerializer, SnakeNameSerializer, - SnakeFactSerializer, TagSerializer, + OffTopicChannelNameSerializer, SnakeFactSerializer, SnakeNameSerializer, + TagSerializer ) -- cgit v1.2.3 From 1376a9d1d94626b9dfd70f48b0f447d2aa89ec98 Mon Sep 17 00:00:00 2001 From: Hasan-Ahmad Date: Mon, 15 Oct 2018 21:46:14 +0100 Subject: Added SnakeFact import --- api/tests/test_models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'api') diff --git a/api/tests/test_models.py b/api/tests/test_models.py index 3cf828d6..f2ab87d8 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 ) -- cgit v1.2.3 From 1d0097103b5caed534a1ffc9761f10f4178ba6b0 Mon Sep 17 00:00:00 2001 From: Hasan-Ahmad Date: Mon, 15 Oct 2018 21:49:52 +0100 Subject: added SnakeName to setUp --- api/tests/test_models.py | 1 + 1 file changed, 1 insertion(+) (limited to 'api') diff --git a/api/tests/test_models.py b/api/tests/test_models.py index f2ab87d8..55009bf6 100644 --- a/api/tests/test_models.py +++ b/api/tests/test_models.py @@ -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', -- cgit v1.2.3 From 60363b8d84e7ea86ab82e99dc9d5e11b55d9221e Mon Sep 17 00:00:00 2001 From: Hasan-Ahmad Date: Mon, 15 Oct 2018 21:56:32 +0100 Subject: exterminated trailing comma, fixed imports 2 per line --- api/serializers.py | 2 +- api/viewsets.py | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) (limited to 'api') diff --git a/api/serializers.py b/api/serializers.py index a0f823e9..fe2ab2f1 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -5,7 +5,7 @@ from .models import ( DocumentationLink, Member, OffTopicChannelName, Role, SnakeFact, SnakeName, - Tag, + Tag ) diff --git a/api/viewsets.py b/api/viewsets.py index 9edc2b69..22862c16 100644 --- a/api/viewsets.py +++ b/api/viewsets.py @@ -11,12 +11,13 @@ from rest_framework_bulk import BulkCreateModelMixin from .models import ( DocumentationLink, Member, - OffTopicChannelName, SnakeFact, SnakeName, Tag + OffTopicChannelName, SnakeFact, + SnakeName, Tag ) from .serializers import ( DocumentationLinkSerializer, MemberSerializer, - OffTopicChannelNameSerializer, SnakeFactSerializer, SnakeNameSerializer, - TagSerializer + OffTopicChannelNameSerializer, SnakeFactSerializer, + SnakeNameSerializer, TagSerializer ) -- cgit v1.2.3