summaryrefslogtreecommitdiffstats
path: root/hyperkitty
diff options
context:
space:
mode:
Diffstat (limited to 'hyperkitty')
-rw-r--r--hyperkitty/api.py105
-rw-r--r--hyperkitty/templates/api.html19
-rw-r--r--hyperkitty/urls.py6
3 files changed, 93 insertions, 37 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)
diff --git a/hyperkitty/templates/api.html b/hyperkitty/templates/api.html
index 4c4af27..422d6a2 100644
--- a/hyperkitty/templates/api.html
+++ b/hyperkitty/templates/api.html
@@ -27,13 +27,24 @@
</div>
<div class="even" style="padding-left: 1em">
+ <h3>Lists <a>/api/list/</a></h3>
+ <p>
+Using the address /api/list/ you will be able to
+retrieve the information known about all the mailing-lists.
+ </p>
+ <p> For example: <a href="{% url 'api_list' %}?format=api">
+ {% url 'api_list' %}
+ </a>
+ </p>
+ </div>
+ <div class="even" style="padding-left: 1em">
<h3>Emails <a>/api/email/&lt;list name&gt;/&lt;Message-ID&gt;</a></h3>
<p>
Using the address /api/email/&lt;list name&gt;/&lt;Message-ID&gt; you will be able to
retrieve the information known about a specific email on the specified mailing-list.
</p>
- <p> For example: <a href="{% url 'api_email' mlist_fqdn='devel@fp.o' hashid='13129854572893334' %}">
- {% url 'api_email' mlist_fqdn='devel@fp.o' hashid='13129854572893334' %}
+ <p> For example: <a href="{% url 'api_email' mlist_fqdn='devel@fp.o' messageid='13129854572893334' %}?format=api">
+ {% url 'api_email' mlist_fqdn='devel@fp.o' messageid='13129854572893334' %}
</a>
</p>
</div>
@@ -43,7 +54,7 @@ retrieve the information known about a specific email on the specified mailing-l
Using the address /api/thread/&lt;list name&gt;/&lt;Message-ID&gt; you will be able to
retrieve the all the email for a specific thread on the specified mailing-list.
</p>
- <p> For example: <a href="{% url 'api_thread' mlist_fqdn='devel@fp.o' threadid='13129854572893334' %}">
+ <p> For example: <a href="{% url 'api_thread' mlist_fqdn='devel@fp.o' threadid='13129854572893334' %}?format=api">
{% url 'api_thread' mlist_fqdn='devel@fp.o' threadid='13129854572893334' %}
</a>
</p>
@@ -61,7 +72,7 @@ search for all emails of the specified mailing-list containing the provided keyw
<li>Content</li>
<li>SubjectContent</li>
</ul>
- <p> For example: <a href="{% url 'api_search' mlist_fqdn='devel@fp.o' field='From' keyword='pingoured' %}">
+ <p> For example: <a href="{% url 'api_search' mlist_fqdn='devel@fp.o' field='From' keyword='pingoured' %}?format=api">
{% url 'api_search' mlist_fqdn='devel@fp.o' field='From' keyword='pingoured' %}
</a>
</p>
diff --git a/hyperkitty/urls.py b/hyperkitty/urls.py
index 887c54f..1a2e945 100644
--- a/hyperkitty/urls.py
+++ b/hyperkitty/urls.py
@@ -23,7 +23,7 @@
from django.conf.urls import patterns, include, url
from django.conf import settings
from django.views.generic.base import TemplateView
-from api import EmailResource, ThreadResource, SearchResource
+from api import ListResource, EmailResource, ThreadResource, SearchResource
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.contrib.auth.views import login as login_view
@@ -93,7 +93,9 @@ urlpatterns = patterns('hyperkitty.views',
# REST API
url(r'^api/$', TemplateView.as_view(template_name="api.html")),
- url(r'^api/email\/(?P<mlist_fqdn>[^/@]+@[^/@]+)\/(?P<hashid>.*)/',
+ url(r'^api/list\/',
+ ListResource.as_view(), name="api_list"),
+ url(r'^api/email\/(?P<mlist_fqdn>[^/@]+@[^/@]+)\/(?P<messageid>.*)/',
EmailResource.as_view(), name="api_email"),
url(r'^api/thread\/(?P<mlist_fqdn>[^/@]+@[^/@]+)\/(?P<threadid>.*)/',
ThreadResource.as_view(), name="api_thread"),