Skip to main content

Implementation of Google JSON Style Guide for Django

Project description

pre-commit autoflake: on Imports: isort Code style: black PyPI PyPI - Python Version


Django Google JSON Style API

Implementation of Google JSON Style Guide for Django

Install

pip install django-google-json-style-api

Example

# models.py

from django.db import models


class City(models.Model):
    city_name = models.TextField()

# schemas.py

from typing import List

from pydantic import BaseModel

from django_google_json_style_api.base import CamelModel
from django_google_json_style_api.responses import BaseResponseData, BaseSuccessResponse


class AddCityRequest(CamelModel):
    city_name: str


class AddCitiesRequest(BaseModel):
    cities: List[AddCityRequest]


class CityDataItem(CamelModel):
    id: int
    city_name: str


class CityResponseData(BaseResponseData[CityDataItem]):
    ...


class CityResponse(BaseSuccessResponse[CityResponseData]):
    __kind__ = "City"

# urls.py

from django.urls import path
from django.views.decorators import csrf

from . import views

urlpatterns = [
    path(
        "add/",
        csrf.csrf_exempt(views.AddCitiesView.as_view()),
        name="add-cities",
    ),
]


# views.py

from django_google_json_style_api.decorators import process_json_response

from django.utils.decorators import method_decorator
from django.views import View

from .models import City
from .schemas import AddCitiesRequest, CityResponse, CityDataItem


@method_decorator(process_json_response(api_version='1.1'), name="dispatch")
class AddCitiesView(View):
    def post(self, request):
        cities = AddCitiesRequest.parse_raw(request.body).cities
        response_items = []
        for add_city_request in cities:
            city = City.objects.create(**add_city_request.dict())
            city_data_item = CityDataItem(
                id=city.id,
                city_name=city.city_name
            )
            response_items.append(city_data_item)
        return CityResponse.make_from(
            request,
            total_items=City.objects.count(),
            items=response_items,
        )

# tests.py

from django.test import TestCase
from django.urls import reverse


class TestCities(TestCase):

    def test_add_cities(self):
        url = reverse('add-cities')
        data = {
            "cities": [
                {"cityName": "Tyumen"},
                {"cityName": "Moscow"},
            ]
        }
        response = self.client.post(url, data, content_type="application/json")
        response_json = response.json()
        self.assertDictEqual(
            response_json,
            {
                'apiVersion': '1.1',
                "data": {
                    'currentItemCount': 2,
                    "items": [
                        {
                            "id": 1,
                            "cityName": "Tyumen",
                        },
                        {
                            "id": 2,
                            "cityName": "Moscow",
                        },
                    ],
                    'itemsPerPage': 100,
                    'kind': 'City',
                    'startIndex': 0,
                    'totalItems': 2,
                },
            }
        )

TODO:

Docs, tests

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django-google-json-style-api-0.3.3.tar.gz (7.4 kB view hashes)

Uploaded Source

Built Distribution

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page