From 85d040687fc21f13f3a124eb88f154027e052da1 Mon Sep 17 00:00:00 2001
From: Pierre-Yves Chibon
Date: Thu, 29 Mar 2012 17:02:47 +0200
Subject: Add Search facility to the REST API
---
api.py | 29 +++++++++++++++++++++++++++++
templates/api.html | 20 ++++++++++++++++++++
urls.py | 3 ++-
3 files changed, 51 insertions(+), 1 deletion(-)
diff --git a/api.py b/api.py
index 4bdcd27..1f934c5 100644
--- a/api.py
+++ b/api.py
@@ -6,6 +6,7 @@ from django.http import HttpResponseNotModified, HttpResponse
from lib import mongo
import pymongo
import json
+import re
connection = pymongo.Connection('localhost', 27017)
@@ -36,3 +37,31 @@ class ThreadResource(View):
return HttpResponse(status=404)
else:
return thread
+
+
+class SearchResource(View):
+ """ 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)
+
+ 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
+ threads = mongo.search_archives(list_name, query_string)
+ if not threads:
+ return HttpResponse(status=404)
+ else:
+ return threads
diff --git a/templates/api.html b/templates/api.html
index ba3abb4..afabbb4 100644
--- a/templates/api.html
+++ b/templates/api.html
@@ -56,4 +56,24 @@ retrieve the all the email for a specific thread on the specified mailing-list.
+
+
+
+
+
+Using the address /api/search/<list name>/<field>/<keyword> you will be able to
+search for all emails of the specified mailing-list containing the provided keyword in the given field.
+
+
The list of available field is:
+
+ - From
+ - Subject
+ - Content
+ - SubjectContent
+
+
For example:
+ /api/search/devel@fp.o/From/pingoured
+
+
+
{% endblock %}
diff --git a/urls.py b/urls.py
index baa7646..602a69d 100644
--- a/urls.py
+++ b/urls.py
@@ -1,6 +1,6 @@
from django.conf.urls.defaults import patterns, include, url
from django.conf import settings
-from api import EmailResource, ThreadResource
+from api import EmailResource, ThreadResource, SearchResource
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
@@ -46,6 +46,7 @@ urlpatterns = patterns('',
url(r'^api/$', 'views.pages.api'),
url(r'^api/email\/(?P.*@.*)\/(?P.*)/', EmailResource.as_view()),
url(r'^api/thread\/(?P.*@.*)\/(?P.*)/', ThreadResource.as_view()),
+ url(r'^api/search\/(?P.*@.*)\/(?P.*)\/(?P.*)/', SearchResource.as_view()),
# Uncomment the admin/doc line below to enable admin documentation:
# url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
--
cgit