Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Expose homepage data on the API #739

Merged
merged 2 commits into from
Sep 11, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 86 additions & 0 deletions network-api/app/networkapi/homepage/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
from rest_framework import serializers

from networkapi.homepage.models import (
Homepage,
HomepageLeaders,
HomepageNews,
HomepageHighlights,
)
from networkapi.people.serializers import PersonSerializer
from networkapi.news.serializers import NewsSerializer
from networkapi.highlights.serializers import HighlightSerializer


def serialize_relation(
homepage_obj,
through_model,
related_field_name,
related_serializer,
):
"""
Returns a list of serialized related objects that are related to the
homepage

:param homepage_obj: is the instance that we want to seialize related
objects for
:param through_model: is the model class that represents the relation (not
the model of the related object itself)
:param related_field_name: is the field name on the `through_model` that
is a foreign key pointing to the model related to the homepage
:param related_serializer: is the serializer class to use to serialize the
related model instance
:returns: list of serialized related model instances
"""

related_objs = []
relation = (
through_model.objects
.select_related(related_field_name)
.order_by('_order')
.filter(homepage=homepage_obj)
)

for related_field in relation:
related_objs.append(getattr(related_field, related_field_name))

return related_serializer(related_objs, many=True).data


class HomepageSerializer(serializers.ModelSerializer):
"""
Serializes a single (the only) homepage object including its
related models using their default serializers
"""
leaders = serializers.SerializerMethodField()

def get_leaders(self, instance):
return serialize_relation(
instance,
HomepageLeaders,
'leader',
PersonSerializer
)

highlights = serializers.SerializerMethodField()

def get_highlights(self, instance):
return serialize_relation(
instance,
HomepageHighlights,
'highlights',
HighlightSerializer
)

news = serializers.SerializerMethodField()

def get_news(self, instance):
return serialize_relation(
instance,
HomepageNews,
'news',
NewsSerializer
)

class Meta:
model = Homepage
fields = ('leaders', 'news', 'highlights',)
7 changes: 7 additions & 0 deletions network-api/app/networkapi/homepage/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from django.conf.urls import url

from networkapi.homepage.views import HomepageView

urlpatterns = [
url('^$', HomepageView.as_view(), name='homepage'),
]
24 changes: 22 additions & 2 deletions network-api/app/networkapi/homepage/views.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,23 @@
# from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.permissions import AllowAny
from rest_framework.response import Response
from django.http import Http404

# Create your views here.
from networkapi.homepage.models import Homepage
from networkapi.homepage.serializers import HomepageSerializer


class HomepageView(APIView):
"""
A view that permits a GET to receive the related models on the homepage
"""
permission_classes = (AllowAny,)

def get(self, request, format=None):
homepage = Homepage.objects.last()

if homepage is None:
raise Http404('Homepage has not been created yet')

serializer = HomepageSerializer(homepage)
return Response(serializer.data)
1 change: 1 addition & 0 deletions network-api/app/networkapi/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
url(r'^api/news/', include('networkapi.news.urls')),
url(r'^api/milestones/', include('networkapi.milestones.urls')),
url(r'^api/highlights/', include('networkapi.highlights.urls')),
url(r'^api/homepage/', include('networkapi.homepage.urls')),
url(r'^$', mezzanine.pages.views.page, {'slug': '/'}, name='home'),
url(r'^', include('mezzanine.urls')),
]))
Expand Down