From 321252e316ee5ea8a90e4d24c5e740bdc1efd04a Mon Sep 17 00:00:00 2001 From: derekgilwa Date: Wed, 24 Feb 2016 19:31:39 -0500 Subject: [PATCH 1/2] #16 - Add meta field to the json response. --- resources/serializers.py | 50 +++++++++++++++++++----------------- resources/tests.py | 55 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 23 deletions(-) diff --git a/resources/serializers.py b/resources/serializers.py index a963cd60..36c49f1b 100644 --- a/resources/serializers.py +++ b/resources/serializers.py @@ -11,14 +11,23 @@ Starship, ) +class MetaSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + abstract=True + + meta = serializers.SerializerMethodField() + + def get_meta(self, obj): + return { "created": obj.created, "edited": obj.edited } -class PeopleSerializer(serializers.HyperlinkedModelSerializer): +class PeopleSerializer(MetaSerializer): homeworld = serializers.HyperlinkedRelatedField( read_only=True, view_name="planet-detail" ) + class Meta: model = People fields = ( @@ -35,13 +44,13 @@ class Meta: "species", "vehicles", "starships", - "created", - "edited", "url", + "meta" ) -class PlanetSerializer(serializers.HyperlinkedModelSerializer): + +class PlanetSerializer(MetaSerializer): class Meta: model = Planet @@ -57,13 +66,12 @@ class Meta: "population", "residents", "films", - "created", - "edited", - "url" + "url", + "meta" ) -class FilmSerializer(serializers.HyperlinkedModelSerializer): +class FilmSerializer(MetaSerializer): class Meta: model = Film @@ -79,13 +87,12 @@ class Meta: "starships", "vehicles", "species", - "created", - "edited", - "url" + "url", + "meta" ) -class SpeciesSerializer(serializers.HyperlinkedModelSerializer): +class SpeciesSerializer(MetaSerializer): homeworld = serializers.HyperlinkedRelatedField( read_only=True, @@ -107,13 +114,12 @@ class Meta: "language", "people", "films", - "created", - "edited", - "url" + "url", + "meta" ) -class VehicleSerializer(serializers.HyperlinkedModelSerializer): +class VehicleSerializer(MetaSerializer): pilots = serializers.HyperlinkedRelatedField( many=True, @@ -137,13 +143,12 @@ class Meta: "vehicle_class", "pilots", "films", - "created", - "edited", - "url" + "url", + "meta" ) -class StarshipSerializer(serializers.HyperlinkedModelSerializer): +class StarshipSerializer(MetaSerializer): pilots = serializers.HyperlinkedRelatedField( many=True, @@ -169,8 +174,7 @@ class Meta: "starship_class", "pilots", "films", - "created", - "edited", - "url" + "url", + "meta" ) diff --git a/resources/tests.py b/resources/tests.py index 310e75b5..2242f473 100644 --- a/resources/tests.py +++ b/resources/tests.py @@ -12,6 +12,9 @@ ) from .renderers import WookieeRenderer +from datetime import datetime +from django.utils import timezone + import json @@ -82,6 +85,9 @@ def test_species_schema(self): self.assertEqual( self.get_query("/api/species/schema").status_code, 200) + def get_timezone_aware_datetime(self, date_string): + return timezone.make_aware(datetime.strptime(date_string, '%Y-%m-%dT%H:%M:%S.%fZ'), timezone.get_current_timezone()) + def test_people_detail(self): response = self.get_query("/api/people/1/") json_data = json.loads(response.content) @@ -89,6 +95,14 @@ def test_people_detail(self): self.assertEqual(response.status_code, 200) self.assertEqual(person.name, json_data["name"]) + def test_people_meta_detail(self): + response = self.get_query("/api/people/1/") + json_data = json.loads(response.content) + person = People.objects.get(pk=1) + self.assertEqual(response.status_code, 200) + self.assertEqual(person.created, self.get_timezone_aware_datetime(json_data["meta"]["created"])) + self.assertEqual(person.edited, self.get_timezone_aware_datetime(json_data["meta"]["edited"])) + def test_planets_detail(self): response = self.get_query("/api/planets/1/") json_data = json.loads(response.content) @@ -96,6 +110,14 @@ def test_planets_detail(self): self.assertEqual(response.status_code, 200) self.assertEqual(planet.name, json_data["name"]) + def test_planet_meta_detail(self): + response = self.get_query("/api/planets/1/") + json_data = json.loads(response.content) + planet = Planet.objects.get(pk=1) + self.assertEqual(response.status_code, 200) + self.assertEqual(planet.created, self.get_timezone_aware_datetime(json_data["meta"]["created"])) + self.assertEqual(planet.edited, self.get_timezone_aware_datetime(json_data["meta"]["edited"])) + def test_films_detail(self): response = self.get_query("/api/films/1/") json_data = json.loads(response.content) @@ -103,6 +125,14 @@ def test_films_detail(self): self.assertEqual(response.status_code, 200) self.assertEqual(film.title, json_data["title"]) + def test_film_meta_detail(self): + response = self.get_query("/api/films/1/") + json_data = json.loads(response.content) + film = Film.objects.get(pk=1) + self.assertEqual(response.status_code, 200) + self.assertEqual(film.created, self.get_timezone_aware_datetime(json_data["meta"]["created"])) + self.assertEqual(film.edited, self.get_timezone_aware_datetime(json_data["meta"]["edited"])) + def test_starships_detail(self): response = self.get_query("/api/starships/2/") json_data = json.loads(response.content) @@ -110,6 +140,14 @@ def test_starships_detail(self): self.assertEqual(response.status_code, 200) self.assertEqual(starship.name, json_data["name"]) + def test_starship_meta_detail(self): + response = self.get_query("/api/starships/2/") + json_data = json.loads(response.content) + starship = Starship.objects.get(pk=2) + self.assertEqual(response.status_code, 200) + self.assertEqual(starship.created, self.get_timezone_aware_datetime(json_data["meta"]["created"])) + self.assertEqual(starship.edited, self.get_timezone_aware_datetime(json_data["meta"]["edited"])) + def test_vehicles_detail(self): response = self.get_query("/api/vehicles/4/") json_data = json.loads(response.content) @@ -117,6 +155,14 @@ def test_vehicles_detail(self): self.assertEqual(response.status_code, 200) self.assertEqual(vehicle.name, json_data["name"]) + def test_vehicle_meta_detail(self): + response = self.get_query("/api/vehicles/4/") + json_data = json.loads(response.content) + vehicle = Vehicle.objects.get(pk=4) + self.assertEqual(response.status_code, 200) + self.assertEqual(vehicle.created, self.get_timezone_aware_datetime(json_data["meta"]["created"])) + self.assertEqual(vehicle.edited, self.get_timezone_aware_datetime(json_data["meta"]["edited"])) + def test_species_detail(self): response = self.get_query("/api/species/1/") json_data = json.loads(response.content) @@ -124,6 +170,14 @@ def test_species_detail(self): self.assertEqual(response.status_code, 200) self.assertEqual(specie.name, json_data["name"]) + def test_species_meta_detail(self): + response = self.get_query("/api/species/1/") + json_data = json.loads(response.content) + species = Species.objects.get(pk=1) + self.assertEqual(response.status_code, 200) + self.assertEqual(species.created, self.get_timezone_aware_datetime(json_data["meta"]["created"])) + self.assertEqual(species.edited, self.get_timezone_aware_datetime(json_data["meta"]["edited"])) + def test_etag(self): valid_etag = self.get_query("/api/")["ETag"] self.client.defaults['HTTP_IF_NONE_MATCH'] = valid_etag @@ -147,3 +201,4 @@ def test_wookie_format(self): wr.translate_to_wookie(specie.name), json_data[wr.translate_to_wookie("name")] ) + From 2ab8ec85e63b791b7ca806631e57489b16e13a78 Mon Sep 17 00:00:00 2001 From: derekgilwa Date: Thu, 25 Feb 2016 08:23:19 -0500 Subject: [PATCH 2/2] Unremove created and edited from the response. --- resources/serializers.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/resources/serializers.py b/resources/serializers.py index 36c49f1b..77168a9f 100644 --- a/resources/serializers.py +++ b/resources/serializers.py @@ -44,6 +44,8 @@ class Meta: "species", "vehicles", "starships", + "created", + "edited", "url", "meta" ) @@ -66,6 +68,8 @@ class Meta: "population", "residents", "films", + "created", + "edited", "url", "meta" ) @@ -87,6 +91,8 @@ class Meta: "starships", "vehicles", "species", + "created", + "edited", "url", "meta" ) @@ -114,6 +120,8 @@ class Meta: "language", "people", "films", + "created", + "edited", "url", "meta" ) @@ -143,6 +151,8 @@ class Meta: "vehicle_class", "pilots", "films", + "created", + "edited", "url", "meta" ) @@ -174,6 +184,8 @@ class Meta: "starship_class", "pilots", "films", + "created", + "edited", "url", "meta" )