Skip to content

Commit

Permalink
WIP on products API.
Browse files Browse the repository at this point in the history
  • Loading branch information
mythmon committed May 28, 2014
1 parent ae0ff3e commit 4dc7d5f
Show file tree
Hide file tree
Showing 6 changed files with 96 additions and 20 deletions.
53 changes: 53 additions & 0 deletions kitsune/products/api.py
@@ -0,0 +1,53 @@
from rest_framework import generics, serializers

from kitsune.sumo.api import CORSMixin
from kitsune.products.models import Product, Topic


class ProductSerializer(serializers.ModelSerializer):
platforms = serializers.SlugRelatedField(many=True, slug_field='slug')

class Meta:
model = Product
fields = ('id', 'title', 'slug', 'description', 'platforms', 'visible')


class ProductList(CORSMixin, generics.ListAPIView):
"""List all documents."""
queryset = Product.objects.all()
serializer_class = ProductSerializer

def get_queryset(self):
queryset = self.queryset

is_visible = self.request.QUERY_PARAMS.get('is_visible', True)

if is_visible is not None:
queryset = queryset.filter(visible=is_visible)

return queryset


class TopicSerializer(serializers.ModelSerializer):
parent = serializers.SlugRelatedField(slug_field='slug')
product = serializers.SlugRelatedField(slug_field='slug')

class Meta:
model = Topic
fields = ('id', 'title', 'slug', 'description', 'parent', 'visible',
'product')


class TopicList(CORSMixin, generics.ListAPIView):
queryset = Topic.objects.all()
serializer_class = TopicSerializer

def get_queryset(self):
queryset = self.queryset

is_visible = self.request.QUERY_PARAMS.get('is_visible', True)

if is_visible is not None:
queryset = queryset.filter(visible=is_visible)

return queryset
11 changes: 11 additions & 0 deletions kitsune/products/urls_api.py
@@ -0,0 +1,11 @@
from django.conf.urls import patterns, url

from kitsune.products import api


# API urls
urlpatterns = patterns(
'',
url(r'^$', api.ProductList.as_view()),
url(r'^(?P<slug>[^/]+)/topics$', api.TopicList.as_view()),
)
17 changes: 17 additions & 0 deletions kitsune/sumo/api.py
@@ -0,0 +1,17 @@
from rest_framework.exceptions import APIException


class CORSMixin(object):
def finalize_response(self, request, response, *args, **kwargs):
response = (super(CORSMixin, self)
.finalize_response(request, response, *args, **kwargs))
response['Access-Control-Allow-Origin'] = '*'
return response


class GenericAPIException(APIException):
def __init__(self, status_code, detail, **kwargs):
self.status_code = status_code
self.detail = detail
for key, val in kwargs.items():
setattr(self, key, val)
1 change: 1 addition & 0 deletions kitsune/urls.py
Expand Up @@ -64,6 +64,7 @@

# APIs
(r'^api/kb/', include('kitsune.wiki.urls_api')),
(r'^api/products/', include('kitsune.products.urls_api')),
)

# Handle 404 and 500 errors
Expand Down
30 changes: 12 additions & 18 deletions kitsune/wiki/api.py
@@ -1,9 +1,11 @@
from django.db.models import Q
from django.shortcuts import get_object_or_404

from rest_framework import generics, serializers, status
from rest_framework.exceptions import APIException

from kitsune.sumo.api import CORSMixin, GenericAPIException
from kitsune.wiki.models import Document
from kitsune.wiki.config import REDIRECT_HTML


class DocumentShortSerializer(serializers.ModelSerializer):
Expand All @@ -22,27 +24,11 @@ class Meta:
'html')


class CORSMixin(object):
def finalize_response(self, request, response, *args, **kwargs):
response = (super(CORSMixin, self)
.finalize_response(request, response, *args, **kwargs))
response['Access-Control-Allow-Origin'] = '*'
return response


class GenericAPIException(APIException):
def __init__(self, status_code, detail, **kwargs):
self.status_code = status_code
self.detail = detail
for key, val in kwargs.items():
setattr(self, key, val)


class DocumentList(CORSMixin, generics.ListAPIView):
"""List all documents."""
queryset = Document.objects.all()
serializer_class = DocumentShortSerializer
paginate_by = 10
paginate_by = 100

def get_queryset(self):
queryset = self.queryset
Expand All @@ -52,6 +38,7 @@ def get_queryset(self):
topic = self.request.QUERY_PARAMS.get('topic')
is_template = self.request.QUERY_PARAMS.get('is_template', False)
is_archived = self.request.QUERY_PARAMS.get('is_archived', False)
is_redirect = self.request.QUERY_PARAMS.get('is_redirect', False)

if locale is not None:
queryset = queryset.filter(locale=locale)
Expand All @@ -71,6 +58,13 @@ def get_queryset(self):
if is_archived is not None:
queryset = queryset.filter(is_archived=is_archived)

if is_redirect is not None:
redirect_filter = Q(html__startswith=REDIRECT_HTML)
if is_redirect:
queryset = queryset.filter(redirect_filter)
else:
queryset = queryset.filter(~redirect_filter)

return queryset


Expand Down
4 changes: 2 additions & 2 deletions kitsune/wiki/urls_api.py
Expand Up @@ -6,6 +6,6 @@
# API urls
urlpatterns = patterns(
'',
url(r'documents/?$', api.DocumentList.as_view()),
url(r'documents/(?P<slug>[^/]+)$', api.DocumentDetail.as_view()),
url(r'^$', api.DocumentList.as_view()),
url(r'^(?P<slug>[^/]+)$', api.DocumentDetail.as_view()),
)

0 comments on commit 4dc7d5f

Please sign in to comment.