summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPierre-Yves Chibon <pingou@pingoured.fr>2012-03-29 17:02:47 +0200
committerPierre-Yves Chibon <pingou@pingoured.fr>2012-03-29 17:02:47 +0200
commit85d040687fc21f13f3a124eb88f154027e052da1 (patch)
tree5fcba4e35080f8ea9773f711c3d178b1a77faad2
parent547ab59c2c0477d98ece16a264e2c56f1b04a822 (diff)
downloadhyperkitty-85d040687fc21f13f3a124eb88f154027e052da1.tar.gz
hyperkitty-85d040687fc21f13f3a124eb88f154027e052da1.tar.xz
hyperkitty-85d040687fc21f13f3a124eb88f154027e052da1.zip
Add Search facility to the REST API
-rw-r--r--api.py29
-rw-r--r--templates/api.html20
-rw-r--r--urls.py3
3 files changed, 51 insertions, 1 deletions
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.
</a>
</p>
</div>
+ <div class="even" style="padding-left: 1em">
+ <h3>Search <a>/api/search/&lt;list name&gt;/&lt;field&gt;/&lt;keyword&gt;</a></h3>
+ <p>
+ </p>
+ <p>
+Using the address /api/search/&lt;list name&gt;/&lt;field&gt;/&lt;keyword&gt; you will be able to
+search for all emails of the specified mailing-list containing the provided keyword in the given field.
+ </p>
+ <p>The list of available field is:</p>
+ <ul>
+ <li>From</li>
+ <li>Subject</li>
+ <li>Content</li>
+ <li>SubjectContent</li>
+ </ul>
+ <p> For example: <a href="/api/search/devel@fp.o/From/pingoured">
+ /api/search/devel@fp.o/From/pingoured
+ </a>
+ </p>
+ </div>
{% 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<mlist_fqdn>.*@.*)\/(?P<messageid>.*)/', EmailResource.as_view()),
url(r'^api/thread\/(?P<mlist_fqdn>.*@.*)\/(?P<threadid>.*)/', ThreadResource.as_view()),
+ url(r'^api/search\/(?P<mlist_fqdn>.*@.*)\/(?P<field>.*)\/(?P<keyword>.*)/', SearchResource.as_view()),
# Uncomment the admin/doc line below to enable admin documentation:
# url(r'^admin/doc/', include('django.contrib.admindocs.urls')),