diff --git a/resources/serializers.py b/resources/serializers.py index a963cd60..77168a9f 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 = ( @@ -38,10 +47,12 @@ class Meta: "created", "edited", "url", + "meta" ) -class PlanetSerializer(serializers.HyperlinkedModelSerializer): + +class PlanetSerializer(MetaSerializer): class Meta: model = Planet @@ -59,11 +70,12 @@ class Meta: "films", "created", "edited", - "url" + "url", + "meta" ) -class FilmSerializer(serializers.HyperlinkedModelSerializer): +class FilmSerializer(MetaSerializer): class Meta: model = Film @@ -81,11 +93,12 @@ class Meta: "species", "created", "edited", - "url" + "url", + "meta" ) -class SpeciesSerializer(serializers.HyperlinkedModelSerializer): +class SpeciesSerializer(MetaSerializer): homeworld = serializers.HyperlinkedRelatedField( read_only=True, @@ -109,11 +122,12 @@ class Meta: "films", "created", "edited", - "url" + "url", + "meta" ) -class VehicleSerializer(serializers.HyperlinkedModelSerializer): +class VehicleSerializer(MetaSerializer): pilots = serializers.HyperlinkedRelatedField( many=True, @@ -139,11 +153,12 @@ class Meta: "films", "created", "edited", - "url" + "url", + "meta" ) -class StarshipSerializer(serializers.HyperlinkedModelSerializer): +class StarshipSerializer(MetaSerializer): pilots = serializers.HyperlinkedRelatedField( many=True, @@ -171,6 +186,7 @@ class Meta: "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")] ) +