summaryrefslogtreecommitdiffstats
path: root/hyperkitty/api.py
diff options
context:
space:
mode:
authorAslak Knutsen <aslak@redhat.com>2013-03-01 18:46:45 +0100
committerAurélien Bompard <aurelien@bompard.org>2013-03-04 17:11:15 +0100
commit794676f241a284a2df95b57224aa7f9165f058e0 (patch)
treef2971c99fe16938b4888283b98d40a6c3ee63515 /hyperkitty/api.py
parent6150ebc0362118789c8f3d7b57d93f68dc1cd62d (diff)
downloadhyperkitty-794676f241a284a2df95b57224aa7f9165f058e0.tar.gz
hyperkitty-794676f241a284a2df95b57224aa7f9165f058e0.tar.xz
hyperkitty-794676f241a284a2df95b57224aa7f9165f058e0.zip
Update REST API to new KittyStore backend
* Move to use APIView as Resource base * Add List Resource to show all lists * Custom serialize Thread, Email and List objects
Diffstat (limited to 'hyperkitty/api.py')
-rw-r--r--hyperkitty/api.py105
1 files changed, 74 insertions, 31 deletions
diff --git a/hyperkitty/api.py b/hyperkitty/api.py
index f7c7431..1160c3d 100644
--- a/hyperkitty/api.py
+++ b/hyperkitty/api.py
@@ -20,68 +20,111 @@
import json
import re
-from rest_framework.views import View
+from rest_framework.views import APIView
+from rest_framework.response import Response
+from rest_framework import serializers
+from rest_framework.exceptions import ParseError
from django.conf.urls import url
from django.conf import settings
-from django.http import HttpResponseNotModified, HttpResponse
from hyperkitty.lib import get_store
+from kittystore.storm.model import Email, Thread
-class EmailResource(View):
+class ListSerializer(serializers.Serializer):
+ name = serializers.CharField()
+ display_name = serializers.CharField()
+ description = serializers.CharField()
+
+class EmailSerializer(serializers.Serializer):
+ list_name = serializers.EmailField()
+ message_id = serializers.CharField()
+ thread_id = serializers.CharField()
+ sender_name = serializers.CharField()
+ sender_email = serializers.EmailField()
+ subject = serializers.CharField()
+ in_reply_to = serializers.CharField()
+ date = serializers.DateTimeField()
+
+class EmailLinkSerializer(serializers.Serializer):
+ list_name = serializers.EmailField()
+ message_id = serializers.CharField()
+ sender_name = serializers.CharField()
+ sender_email = serializers.EmailField()
+ date = serializers.DateTimeField()
+
+class ThreadSerializer(serializers.Serializer):
+ thread_id = serializers.CharField()
+ list_name = serializers.EmailField()
+ date_active = serializers.DateTimeField()
+ subject = serializers.CharField()
+ starting_email = EmailLinkSerializer()
+ email_ids = serializers.CharField()
+ participants = serializers.CharField()
+
+
+class ListResource(APIView):
+ """ Resource used to retrieve lists from the archives using the
+ REST API.
+ """
+
+ def get(self, request):
+ store = get_store(request)
+ lists = store.get_lists()
+ if not lists:
+ return Response(status=404)
+ else:
+ return Response(ListSerializer(lists, many=True).data)
+
+class EmailResource(APIView):
""" Resource used to retrieve emails from the archives using the
REST API.
"""
def get(self, request, mlist_fqdn, messageid):
- list_name = mlist_fqdn.split('@')[0]
store = get_store(request)
- email = store.get_message_by_hash_from_list(list_name, messageid)
+ email = store.get_message_by_id_from_list(mlist_fqdn, messageid)
if not email:
- return HttpResponse(status=404)
+ return Response(status=404)
else:
- return email
+ return Response(EmailSerializer(email).data)
-class ThreadResource(View):
+class ThreadResource(APIView):
""" Resource used to retrieve threads from the archives using the
REST API.
"""
def get(self, request, mlist_fqdn, threadid):
- list_name = mlist_fqdn.split('@')[0]
store = get_store(request)
- thread = store.get_thread(list_name, threadid)
+ thread = store.get_thread(mlist_fqdn, threadid)
if not thread:
- return HttpResponse(status=404)
+ return Response(status=404)
else:
- return thread
+ return Response(ThreadSerializer(thread).data)
-class SearchResource(View):
+class SearchResource(APIView):
""" Resource used to search the archives using the REST API.
"""
def get(self, request, mlist_fqdn, field, keyword):
- list_name = mlist_fqdn.split('@')[0]
-
- if field not in ['Subject', 'Content', 'SubjectContent', 'From']:
- return HttpResponse(status=404)
+ fields = ['Subject', 'Content', 'SubjectContent', 'From']
+ if field not in fields:
+ raise ParseError(detail="Unknown field: " + field + ". Supported fields are " + ", ".join(fields))
- regex = '.*%s.*' % keyword
- if field == 'SubjectContent':
- query_string = {'$or' : [
- {'Subject': re.compile(regex, re.IGNORECASE)},
- {'Content': re.compile(regex, re.IGNORECASE)}
- ]}
- else:
- query_string = {field.capitalize():
- re.compile(regex, re.IGNORECASE)}
-
- #print query_string, field, keyword
store = get_store(request)
- threads = store.search_archives(list_name, query_string)
+ threads = None
+ if field == 'Subject':
+ threads = store.search_list_for_subject(mlist_fqdn, keyword)
+ elif field == 'Content':
+ threads = store.search_list_for_content(mlist_fqdn, keyword)
+ elif field == 'SubjectContent':
+ threads = store.search_list_for_content_subject(mlist_fqdn, keyword)
+ elif field == 'From':
+ threads = store.search_list_for_sender(mlist_fqdn, keyword)
+
if not threads:
- return HttpResponse(status=404)
+ return Response(status=404)
else:
- return threads
+ return Response(EmailSerializer(threads, many=True).data)