Explorar o código

Add rudimentary API

Colin Powell %!s(int64=3) %!d(string=hai) anos
pai
achega
26ba9deea8
Modificáronse 8 ficheiros con 185 adicións e 5 borrados
  1. 1 0
      emus/settings.py
  2. 16 2
      emus/urls.py
  3. 0 0
      games/api/__init__.py
  4. 35 0
      games/api/serializers.py
  5. 28 0
      games/api/views.py
  6. 4 2
      games/urls.py
  7. 98 1
      poetry.lock
  8. 3 0
      pyproject.toml

+ 1 - 0
emus/settings.py

@@ -40,6 +40,7 @@ INSTALLED_APPS = [
     "django.contrib.staticfiles",
     "django_extensions",
     "games",
+    "rest_framework",
 ]
 
 MIDDLEWARE = [

+ 16 - 2
emus/urls.py

@@ -1,9 +1,23 @@
 from django.contrib import admin
-from django.urls import path, include
-
+from django.urls import include, path
 from games import views as games_views
+from games.api.views import (
+    GameViewSet,
+    PublisherViewSet,
+    DeveloperViewSet,
+    GameSystemViewSet,
+)
+from rest_framework import routers
+
+router = routers.DefaultRouter()
+router.register(r"games", GameViewSet)
+router.register(r"publishers", PublisherViewSet)
+router.register(r"developers", DeveloperViewSet)
+router.register(r"game-systems", GameSystemViewSet)
 
 urlpatterns = [
     path("admin/", admin.site.urls),
+    path("api-auth/", include("rest_framework.urls")),
+    path("api/v1/", include(router.urls)),
     path("", games_views.GameList.as_view()),
 ]

+ 0 - 0
games/api/__init__.py


+ 35 - 0
games/api/serializers.py

@@ -0,0 +1,35 @@
+from rest_framework import serializers
+
+from games.models import Developer, Game, GameSystem, Publisher
+
+# Serializers define the API representation.
+class GameSerializer(serializers.HyperlinkedModelSerializer):
+    class Meta:
+        model = Game
+        fields = (
+            "id",
+            "name",
+            "publisher",
+            "developer",
+            "players",
+            "rating",
+            "game_system",
+        )
+
+
+class DeveloperSerializer(serializers.HyperlinkedModelSerializer):
+    class Meta:
+        model = Developer
+        fields = ("name",)
+
+
+class PublisherSerializer(serializers.HyperlinkedModelSerializer):
+    class Meta:
+        model = Publisher
+        fields = ("name",)
+
+
+class GameSystemSerializer(serializers.HyperlinkedModelSerializer):
+    class Meta:
+        model = GameSystem
+        fields = ("name", "retropie_slug")

+ 28 - 0
games/api/views.py

@@ -0,0 +1,28 @@
+from games.api.serializers import (
+    DeveloperSerializer,
+    GameSerializer,
+    GameSystemSerializer,
+    PublisherSerializer,
+)
+from games.models import Developer, Game, GameSystem, Publisher
+from rest_framework import viewsets
+
+
+class GameViewSet(viewsets.ModelViewSet):
+    queryset = Game.objects.all()
+    serializer_class = GameSerializer
+
+
+class PublisherViewSet(viewsets.ModelViewSet):
+    queryset = Publisher.objects.all()
+    serializer_class = PublisherSerializer
+
+
+class DeveloperViewSet(viewsets.ModelViewSet):
+    queryset = Developer.objects.all()
+    serializer_class = DeveloperSerializer
+
+
+class GameSystemViewSet(viewsets.ModelViewSet):
+    queryset = GameSystem.objects.all()
+    serializer_class = GameSystemSerializer

+ 4 - 2
games/urls.py

@@ -1,9 +1,11 @@
-#!/usr/bin/env python3
-from django.urls import path
+from django.urls import include, path
+from games.api.views import GameViewSet
+from rest_framework import routers
 
 # importing views from views..py
 from .views import CodeList
 
+
 urlpatterns = [
     path("", CodeList.as_view()),
 ]

+ 98 - 1
poetry.lock

@@ -68,9 +68,59 @@ category = "main"
 optional = false
 python-versions = ">=3.6"
 
+[[package]]
+name = "django-filter"
+version = "21.1"
+description = "Django-filter is a reusable Django application for allowing users to filter querysets dynamically."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
 [package.dependencies]
 Django = ">=2.2"
 
+[[package]]
+name = "djangorestframework"
+version = "3.13.1"
+description = "Web APIs for Django, made easy."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+django = ">=2.2"
+pytz = "*"
+
+[[package]]
+name = "importlib-metadata"
+version = "4.11.3"
+description = "Read metadata from Python packages"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.dependencies]
+zipp = ">=0.5"
+
+[package.extras]
+docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"]
+perf = ["ipython"]
+testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"]
+
+[[package]]
+name = "markdown"
+version = "3.3.6"
+description = "Python implementation of Markdown."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""}
+
+[package.extras]
+testing = ["coverage", "pyyaml"]
+
 [[package]]
 name = "python-dateutil"
 version = "2.8.2"
@@ -101,6 +151,14 @@ category = "main"
 optional = false
 python-versions = ">=3.5"
 
+[[package]]
+name = "pytz"
+version = "2022.1"
+description = "World timezone definitions, modern and historical"
+category = "main"
+optional = false
+python-versions = "*"
+
 [[package]]
 name = "six"
 version = "1.16.0"
@@ -125,10 +183,22 @@ category = "main"
 optional = false
 python-versions = ">=2"
 
+[[package]]
+name = "zipp"
+version = "3.7.0"
+description = "Backport of pathlib-compatible object wrapper for zip files"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+
+[package.extras]
+docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
+testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"]
+
 [metadata]
 lock-version = "1.1"
 python-versions = "^3.8"
-content-hash = "020108f8e675d6fcf2e0b315047a7dc6f57bd4f3e9bb8f9cf629b1b666583e67"
+content-hash = "520150e397681966a3c125ac4086c99aa178c92dd8792184168d968c339b41a8"
 
 [metadata.files]
 asgiref = [
@@ -169,6 +239,25 @@ django-extensions = [
     {file = "django-extensions-3.1.5.tar.gz", hash = "sha256:28e1e1bf49f0e00307ba574d645b0af3564c981a6dfc87209d48cb98f77d0b1a"},
     {file = "django_extensions-3.1.5-py3-none-any.whl", hash = "sha256:9238b9e016bb0009d621e05cf56ea8ce5cce9b32e91ad2026996a7377ca28069"},
 ]
+django-filter = [
+    {file = "django-filter-21.1.tar.gz", hash = "sha256:632a251fa8f1aadb4b8cceff932bb52fe2f826dd7dfe7f3eac40e5c463d6836e"},
+    {file = "django_filter-21.1-py3-none-any.whl", hash = "sha256:f4a6737a30104c98d2e2a5fb93043f36dd7978e0c7ddc92f5998e85433ea5063"},
+]
+django-restframework = [
+    {file = "django-restframework-0.0.1.tar.gz", hash = "sha256:2bec9265463693ada558ad9a58c31f6f3de005a932fbfeaadf983c5c9f3b7058"},
+]
+djangorestframework = [
+    {file = "djangorestframework-3.13.1-py3-none-any.whl", hash = "sha256:24c4bf58ed7e85d1fe4ba250ab2da926d263cd57d64b03e8dcef0ac683f8b1aa"},
+    {file = "djangorestframework-3.13.1.tar.gz", hash = "sha256:0c33407ce23acc68eca2a6e46424b008c9c02eceb8cf18581921d0092bc1f2ee"},
+]
+importlib-metadata = [
+    {file = "importlib_metadata-4.11.3-py3-none-any.whl", hash = "sha256:1208431ca90a8cca1a6b8af391bb53c1a2db74e5d1cef6ddced95d4b2062edc6"},
+    {file = "importlib_metadata-4.11.3.tar.gz", hash = "sha256:ea4c597ebf37142f827b8f39299579e31685c31d3a438b59f469406afd0f2539"},
+]
+markdown = [
+    {file = "Markdown-3.3.6-py3-none-any.whl", hash = "sha256:9923332318f843411e9932237530df53162e29dc7a4e2b91e35764583c46c9a3"},
+    {file = "Markdown-3.3.6.tar.gz", hash = "sha256:76df8ae32294ec39dcf89340382882dfa12975f87f45c3ed1ecdb1e8cefc7006"},
+]
 python-dateutil = [
     {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"},
     {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"},
@@ -181,6 +270,10 @@ python-json-logger = [
     {file = "python-json-logger-2.0.2.tar.gz", hash = "sha256:202a4f29901a4b8002a6d1b958407eeb2dd1d83c18b18b816f5b64476dde9096"},
     {file = "python_json_logger-2.0.2-py3-none-any.whl", hash = "sha256:99310d148f054e858cd5f4258794ed6777e7ad2c3fd7e1c1b527f1cba4d08420"},
 ]
+pytz = [
+    {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"},
+    {file = "pytz-2022.1.tar.gz", hash = "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7"},
+]
 six = [
     {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
     {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
@@ -193,3 +286,7 @@ tzdata = [
     {file = "tzdata-2022.1-py2.py3-none-any.whl", hash = "sha256:238e70234214138ed7b4e8a0fab0e5e13872edab3be586ab8198c407620e2ab9"},
     {file = "tzdata-2022.1.tar.gz", hash = "sha256:8b536a8ec63dc0751342b3984193a3118f8fca2afe25752bb9b7fffd398552d3"},
 ]
+zipp = [
+    {file = "zipp-3.7.0-py3-none-any.whl", hash = "sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375"},
+    {file = "zipp-3.7.0.tar.gz", hash = "sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d"},
+]

+ 3 - 0
pyproject.toml

@@ -12,6 +12,9 @@ python-dateutil = "^2.8.2"
 python-dotenv = "^0.20.0"
 python-json-logger = "^2.0.2"
 colorlog = "^6.6.0"
+djangorestframework = "^3.13.1"
+Markdown = "^3.3.6"
+django-filter = "^21.1"
 
 [tool.poetry.dev-dependencies]