diff --git a/bikeshop_project/bikeshop/settings/base.py b/bikeshop_project/bikeshop/settings/base.py index 6d32945..9982cf9 100644 --- a/bikeshop_project/bikeshop/settings/base.py +++ b/bikeshop_project/bikeshop/settings/base.py @@ -29,7 +29,7 @@ INSTALLED_APPS = [ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', - + 'haystack', 'webpack_loader', 'compressor', @@ -142,4 +142,11 @@ WEBPACK_LOADER = { 'POLL_INTERVAL': 0.1, 'IGNORE': ['.+\.hot-update.js', '.+\.map'] } +} + +HAYSTACK_CONNECTIONS = { + 'default': { + 'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine', + 'PATH': os.path.join(os.path.dirname(__file__), 'whoosh_index'), + }, } \ No newline at end of file diff --git a/bikeshop_project/registration/search_indexes.py b/bikeshop_project/registration/search_indexes.py new file mode 100644 index 0000000..ad20429 --- /dev/null +++ b/bikeshop_project/registration/search_indexes.py @@ -0,0 +1,9 @@ +from haystack import indexes +from .models import Member + + +class MemberIndex(indexes.SearchIndex, indexes.Indexable): + text = indexes.EdgeNgramField(document=True, use_template=True) + + def get_model(self): + return Member diff --git a/bikeshop_project/registration/templates/search/indexes/registration/member_text.txt b/bikeshop_project/registration/templates/search/indexes/registration/member_text.txt new file mode 100644 index 0000000..1c75611 --- /dev/null +++ b/bikeshop_project/registration/templates/search/indexes/registration/member_text.txt @@ -0,0 +1,2 @@ +{{ object.email }} +{{ object.get_full_name }} \ No newline at end of file diff --git a/bikeshop_project/registration/urls.py b/bikeshop_project/registration/urls.py index 07024cb..c345e7f 100644 --- a/bikeshop_project/registration/urls.py +++ b/bikeshop_project/registration/urls.py @@ -1,7 +1,8 @@ from django.conf.urls import url -from .views import MemberFormView +from .views import MemberFormView, MemberSearchView urlpatterns = [ url(r'^new/$', MemberFormView.as_view(), name='signup'), + url(r'^search/(?P[\w@\.\+]+)/$', MemberSearchView.as_view(), name='member_search'), url(r'^edit/(?P[0-9]+)/$', MemberFormView.as_view(), name='member_edit') ] diff --git a/bikeshop_project/registration/views.py b/bikeshop_project/registration/views.py index 3d1f983..99de29a 100644 --- a/bikeshop_project/registration/views.py +++ b/bikeshop_project/registration/views.py @@ -1,12 +1,17 @@ +import logging + from django.contrib import messages -from django.http import HttpResponseRedirect +from django.core.urlresolvers import reverse +from django.http import HttpResponse, HttpResponseRedirect from django.template.response import TemplateResponse from django.views.generic import View -from django.core.urlresolvers import reverse + +import json +from haystack.query import SearchQuerySet from .forms import MemberForm from .models import Member -import logging + logger = logging.getLogger('bikeshop') @@ -46,3 +51,13 @@ class MemberFormView(View): if member: context['member'] = member return TemplateResponse(request, 'member_form.html', context=context) + + +class MemberSearchView(View): + def get(self, request, query): + sqs = SearchQuerySet().models(Member).autocomplete(text=query)[:5] + results = [dict(name=result.object.get_full_name(), email=result.object.email, id=result.object.id) for result in sqs] + + data = json.dumps(dict(results=results)) + + return HttpResponse(data, content_type='application/json') \ No newline at end of file diff --git a/requirements/base.txt b/requirements/base.txt index edb5239..65f86f8 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -4,4 +4,6 @@ django-widget-tweaks==1.4.1 psycopg2==2.6.1 django-libsass==0.6 django_compressor==2.0 -python-dateutil==2.5.3 \ No newline at end of file +python-dateutil==2.5.3 +whoosh==2.7.4 +git+git://github.com/django-haystack/django-haystack.git \ No newline at end of file