From 5bf96f8b12d05f59f03bbb1b53639b59340c2f32 Mon Sep 17 00:00:00 2001 From: michaelglenister Date: Thu, 26 Feb 2026 19:52:14 +0200 Subject: [PATCH] Remove elasticsearch --- bin/wait-for-deps.sh | 1 - docker-compose.yml | 19 ----- global_test_case.py | 13 +--- nuntium/forms.py | 12 +-- nuntium/search_indexes.py | 24 +----- nuntium/subdomain_urls.py | 2 +- nuntium/tests/answers_search_test.py | 51 ++++--------- nuntium/tests/messages_search_test.py | 101 +++++++------------------- nuntium/urls.py | 2 +- nuntium/views.py | 94 ++++++++++++++++++------ requirements.txt | 3 - setup.py | 2 - writeit/settings.py | 28 ------- 13 files changed, 127 insertions(+), 225 deletions(-) diff --git a/bin/wait-for-deps.sh b/bin/wait-for-deps.sh index b23d3ca1..e7924083 100755 --- a/bin/wait-for-deps.sh +++ b/bin/wait-for-deps.sh @@ -4,6 +4,5 @@ set -o errexit set -o nounset source $(dirname $0)/wait-for-postgres.sh -source $(dirname $0)/wait-for-elasticsearch.sh exec "$@" diff --git a/docker-compose.yml b/docker-compose.yml index 989ab502..94790d30 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -14,7 +14,6 @@ services: command: bin/wait-for-deps.sh ./manage.py runserver 0.0.0.0:8000 depends_on: - db - - elasticsearch - rabbitmq environment: - CELERY_BROKER_URL=amqp://guest:guest@rabbitmq// @@ -23,8 +22,6 @@ services: - DJANGO_DEBUG_TOOLBAR - DJANGO_SECRET_KEY=not-secret-in-dev - DJANGO_TESTING - - ELASTICSEARCH_INDEX=writeinpublic - - ELASTICSEARCH_URL=http://elasticsearch:9200/ - EMAIL_BACKEND=django.core.mail.backends.console.EmailBackend - SESSION_COOKIE_DOMAIN=127.0.0.1.nip.io @@ -36,14 +33,11 @@ services: command: bin/wait-for-deps.sh celery -A writeit worker depends_on: - db - - elasticsearch - rabbitmq environment: - DATABASE_URL=postgresql://writeinpublic:devpassword@db/writeinpublic - DJANGO_DEBUG=True - DJANGO_SECRET_KEY=not-secret-in-dev - - ELASTICSEARCH_INDEX=writeinpublic - - ELASTICSEARCH_URL=http://elasticsearch:9200/ - EMAIL_BACKEND=django.core.mail.backends.console.EmailBackend beat: @@ -54,14 +48,11 @@ services: command: bin/wait-for-deps.sh celery -A writeit beat --pidfile= -s /var/celerybeat/celerybeat-schedule depends_on: - db - - elasticsearch - rabbitmq environment: - DATABASE_URL=postgresql://writeinpublic:devpassword@db/writeinpublic - DJANGO_DEBUG=True - DJANGO_SECRET_KEY=not-secret-in-dev - - ELASTICSEARCH_INDEX=writeinpublic - - ELASTICSEARCH_URL=http://elasticsearch:9200/ - EMAIL_BACKEND=django.core.mail.backends.console.EmailBackend db: @@ -73,15 +64,6 @@ services: volumes: - db-data:/var/lib/postgresql/data - elasticsearch: - image: elasticsearch:1 - volumes: - - elasticsearch-data:/usr/share/elasticsearch/data - environment: - - ES_MAX_MEM=1g - ports: - - 9200 - rabbitmq: image: rabbitmq:3.7.28-management volumes: @@ -96,6 +78,5 @@ volumes: web-attachments: web-coverage: db-data: - elasticsearch-data: rabbitmq-data: beat-data: diff --git a/global_test_case.py b/global_test_case.py index 41be9da2..88ee18f7 100644 --- a/global_test_case.py +++ b/global_test_case.py @@ -1,10 +1,7 @@ import re from django.test import TestCase -from unittest import skipUnless -from django.core.management import call_command from tastypie.test import ResourceTestCase -from django.conf import settings from django.contrib.sites.models import Site import os import subprocess @@ -13,7 +10,6 @@ from django.test import RequestFactory from django.test.client import Client import logging -from haystack.signals import BaseSignalProcessor _LOCALS = threading.local() @@ -150,11 +146,7 @@ class ResourceGlobalTestCase(WriteItTestCaseMixin, ResourceTestCase): pass -@skipUnless(settings.LOCAL_ELASTICSEARCH, "No local elasticsearch") -class SearchIndexTestCase(GlobalTestCase): - def setUp(self): - super(SearchIndexTestCase, self).setUp() - call_command('rebuild_index', verbosity=0, interactive=False) +SearchIndexTestCase = GlobalTestCase from djcelery.contrib.test_runner import CeleryTestSuiteRunner from django_nose import NoseTestSuiteRunner @@ -169,9 +161,6 @@ def run_tests(self, test_labels, extra_tests=None, **kwargs): return super(WriteItTestRunner, self).run_tests(test_labels, extra_tests, **kwargs) -class CeleryTestingSignalProcessor(BaseSignalProcessor): - pass - from vcr import VCR diff --git a/nuntium/forms.py b/nuntium/forms.py index 8b9846d1..f5e518c5 100644 --- a/nuntium/forms.py +++ b/nuntium/forms.py @@ -1,7 +1,7 @@ # coding=utf-8 import urlparse -from django.forms import ModelForm, ModelMultipleChoiceField, SelectMultiple, URLField, Form, Textarea, TextInput, EmailInput +from django.forms import ModelForm, ModelMultipleChoiceField, SelectMultiple, URLField, Form, Textarea, TextInput, EmailInput, CharField from contactos.models import Contact from instance.models import WriteItInstance from .models import Message, Confirmation @@ -9,7 +9,6 @@ from popolo.models import Person from django.forms import ValidationError from django.utils.translation import ugettext as _, ungettext, pgettext_lazy -from haystack.forms import SearchForm from django.utils.html import format_html from django.utils.encoding import force_text from django.utils.safestring import mark_safe @@ -193,15 +192,16 @@ class Meta: fields = [] -class MessageSearchForm(SearchForm): - pass +class MessageSearchForm(Form): + q = CharField(required=False, label='') -class PerInstanceSearchForm(SearchForm): +class PerInstanceSearchForm(Form): + q = CharField(required=False, label='') + def __init__(self, *args, **kwargs): self.writeitinstance = kwargs.pop('writeitinstance', None) super(PerInstanceSearchForm, self).__init__(*args, **kwargs) - self.searchqueryset = self.searchqueryset.filter(writeitinstance=self.writeitinstance.id) class PopitParsingFormMixin(object): diff --git a/nuntium/search_indexes.py b/nuntium/search_indexes.py index d7206a16..1e829aca 100644 --- a/nuntium/search_indexes.py +++ b/nuntium/search_indexes.py @@ -1,26 +1,10 @@ # coding=utf-8 -from haystack import indexes -from celery_haystack.indexes import CelerySearchIndex from .models import Message, Answer -class MessageIndex(CelerySearchIndex, indexes.Indexable): - text = indexes.CharField(document=True, use_template=True) - writeitinstance = indexes.IntegerField(model_attr='writeitinstance__id') +def message_search_queryset(): + return Message.public_objects.all() - def get_model(self): - return Message - def index_queryset(self, using=None): - return self.get_model().public_objects.all() - - -class AnswerIndex(CelerySearchIndex, indexes.Indexable): - text = indexes.CharField(document=True, use_template=True) - writeitinstance = indexes.IntegerField(model_attr='message__writeitinstance__id') - - def get_model(self): - return Answer - - def index_queryset(self, using=None): - return self.get_model().objects.filter(message__in=Message.public_objects.all()) +def answer_search_queryset(): + return Answer.objects.filter(message__in=Message.public_objects.all()) diff --git a/nuntium/subdomain_urls.py b/nuntium/subdomain_urls.py index 52610b45..9abd408c 100644 --- a/nuntium/subdomain_urls.py +++ b/nuntium/subdomain_urls.py @@ -127,7 +127,7 @@ url(r'^from/(?P[-\w]+)/?$', MessagesFromPersonView.as_view(), name='all-messages-from-the-same-author-as'), url(r'^to/(?P[-\d]+)/$', MessagesPerPersonView.as_view(), name='thread_to'), - url(r'^search/$', PerInstanceSearchView(), name='instance_search'), + url(r'^search/$', PerInstanceSearchView.as_view(), name='instance_search'), url(r'^attachment/(?P[-\d]+)/$', download_attachment_view, name='attachment'), url(r'^manage/', include(managepatterns)), url(r'^accounts/logout/$', 'django.contrib.auth.views.logout', kwargs={'next_page': '/'}, name='logout'), diff --git a/nuntium/tests/answers_search_test.py b/nuntium/tests/answers_search_test.py index 03858812..ebbd3882 100644 --- a/nuntium/tests/answers_search_test.py +++ b/nuntium/tests/answers_search_test.py @@ -1,58 +1,40 @@ # coding=utf-8 from global_test_case import GlobalTestCase as TestCase, SearchIndexTestCase -from ..search_indexes import AnswerIndex +from ..search_indexes import answer_search_queryset from subdomains.utils import reverse from ..models import Answer, Message -from haystack import indexes import urllib import urlparse -class AnswerIndexTestCase(TestCase): +class AnswerSearchQuerysetTestCase(TestCase): def setUp(self): - super(AnswerIndexTestCase, self).setUp() - self.index = AnswerIndex() + super(AnswerSearchQuerysetTestCase, self).setUp() for message in Message.objects.all(): message.confirmated = True message.save() - def test_index_parts(self): - self.assertIsInstance(self.index, indexes.SearchIndex) - self.assertIsInstance(self.index, indexes.Indexable) - - self.assertEquals(self.index.get_model(), Answer) - + def test_public_answers_are_searchable(self): public_answers = Answer.objects.filter(message__in=Message.public_objects.all()) - first_answer = public_answers[0] - public_answers_list = list(public_answers) - - self.assertQuerysetEqual(self.index.index_queryset(), [repr(r) for r in public_answers_list]) - - self.assertTrue(self.index.text.document) - self.assertTrue(self.index.text.use_template) - - indexed_text = self.index.text.prepare_template(first_answer) + qs = answer_search_queryset() + for answer in public_answers: + self.assertIn(answer, qs) - self.assertTrue(first_answer.content in indexed_text) - self.assertTrue(first_answer.person.name in indexed_text) - self.assertEquals(self.index.writeitinstance.model_attr, 'message__writeitinstance__id') - - self.assertEquals(self.index.writeitinstance.prepare(first_answer), first_answer.message.writeitinstance.id) + def test_private_message_answers_not_searchable(self): + private_message_answers = Answer.objects.exclude(message__in=Message.public_objects.all()) + qs = answer_search_queryset() + for answer in private_message_answers: + self.assertNotIn(answer, qs) class SearchAnswerAccess(SearchIndexTestCase): def setUp(self): super(SearchAnswerAccess, self).setUp() + for message in Message.objects.all(): + message.confirmated = True + message.save() def test_access_the_url(self): - # I don't like this test that much - # because it seems to be likely to break if I add more - # public messages - # if it ever fails - # well then I'll fix it - - # Based on - # http://stackoverflow.com/questions/2506379/add-params-to-given-url-in-python url = reverse('search_messages', subdomain=None) url += "/" params = {'q': 'Public Answer'} @@ -63,10 +45,7 @@ def test_access_the_url(self): response = self.client.get(url_with_parameters) self.assertEquals(response.status_code, 200) - #the first one the one that says "Public Answer" in example_data.yml - expected_answer = Answer.objects.get(id=1) self.assertIn('page', response.context) results = response.context['page'].object_list self.assertGreaterEqual(len(results), 1) - self.assertEquals(results[0].object.id, expected_answer.id) diff --git a/nuntium/tests/messages_search_test.py b/nuntium/tests/messages_search_test.py index a4e08ad2..eccf4201 100644 --- a/nuntium/tests/messages_search_test.py +++ b/nuntium/tests/messages_search_test.py @@ -1,56 +1,33 @@ # coding=utf-8 from global_test_case import GlobalTestCase as TestCase, SearchIndexTestCase -from ..search_indexes import MessageIndex -from django.contrib.contenttypes.models import ContentType from ..models import Message from ..forms import MessageSearchForm, PerInstanceSearchForm -from haystack import indexes -from haystack.fields import CharField -from haystack.forms import SearchForm +from django.forms import Form from subdomains.utils import reverse from instance.models import WriteItInstance from ..views import MessageSearchView, PerInstanceSearchView -from haystack.views import SearchView +from django.views.generic import View from popolo.models import Person import urllib import urlparse -class MessagesSearchTestCase(TestCase): +class MessagesSearchQuerysetTestCase(TestCase): def setUp(self): - super(MessagesSearchTestCase, self).setUp() - self.first_message = Message.objects.get(id=1) + super(MessagesSearchQuerysetTestCase, self).setUp() self.writeitinstance1 = WriteItInstance.objects.get(id=1) self.person1 = Person.objects.get(id=1) - self.person2 = Person.objects.get(id=2) - self.index = MessageIndex() for message in Message.objects.all(): message.confirmated = True message.save() - def test_messages_index(self): + def test_public_messages_are_searchable(self): public_messages = list(Message.objects.filter(public=True)) - - self.assertIsInstance(self.index, indexes.SearchIndex) - self.assertIsInstance(self.index, indexes.Indexable) - - self.assertEquals(self.index.get_model(), Message) - - self.assertQuerysetEqual(self.index.index_queryset(), [repr(r) for r in public_messages], ordered=False) - - self.assertIsInstance(self.index.text, CharField) - - self.assertTrue(self.index.text.use_template) - - indexed_text = self.index.text.prepare_template(self.first_message) - - self.assertTrue(self.first_message.subject in indexed_text) - self.assertTrue(self.first_message.content in indexed_text) - - self.assertEquals(self.index.writeitinstance.model_attr, 'writeitinstance__id') - - self.assertEquals(self.index.writeitinstance.prepare(self.first_message), self.first_message.writeitinstance.id) + from ..search_indexes import message_search_queryset + qs = list(message_search_queryset()) + for msg in public_messages: + self.assertIn(msg, qs) def test_it_does_not_search_within_private_messages(self): message = Message.objects.create( @@ -62,8 +39,8 @@ def test_it_does_not_search_within_private_messages(self): writeitinstance=self.writeitinstance1, persons=[self.person1], ) - - self.assertNotIn(message, self.index.index_queryset()) + from ..search_indexes import message_search_queryset + self.assertNotIn(message, message_search_queryset()) def test_it_does_not_search_within_non_confirmated_messages(self): non_message = Message.objects.create( @@ -85,8 +62,10 @@ def test_it_does_not_search_within_non_confirmated_messages(self): persons=[self.person1], ) - self.assertIn(confirmated_message, self.index.index_queryset()) - self.assertNotIn(non_message, self.index.index_queryset()) + from ..search_indexes import message_search_queryset + qs = message_search_queryset() + self.assertIn(confirmated_message, qs) + self.assertNotIn(non_message, qs) def test_it_does_not_search_within_non_moderated_messages(self): self.writeitinstance1.config.moderation_needed_in_all_messages = True @@ -101,21 +80,18 @@ def test_it_does_not_search_within_non_moderated_messages(self): ) message.recently_confirmated() - # message is confirmed (or whatever way you spell it) - # but it was written in an instance in wich all messages need moderation, - # and therefore it needs to be moderated before it is shown in the searches - - self.assertNotIn(message, self.index.index_queryset()) + from ..search_indexes import message_search_queryset + self.assertNotIn(message, message_search_queryset()) class MessageSearchFormTestCase(TestCase): def setUp(self): super(MessageSearchFormTestCase, self).setUp() - def test_it_is_a_search_form(self): + def test_it_is_a_form(self): form = MessageSearchForm() - self.assertIsInstance(form, SearchForm) + self.assertIsInstance(form, Form) class MessageSearchViewTestCase(TestCase): @@ -131,23 +107,18 @@ def test_access_the_search_url(self): self.assertIsInstance(response.context['form'], MessageSearchForm) def test_search_view(self): - view = MessageSearchView() - - self.assertIsInstance(view, SearchView) - self.assertEquals(view.form_class, MessageSearchForm) - self.assertEquals(view.template, 'nuntium/search.html') + self.assertTrue(issubclass(MessageSearchView, View)) + self.assertEquals(MessageSearchView.template_name, 'nuntium/search.html') class SearchMessageAccess(SearchIndexTestCase): def setUp(self): super(SearchMessageAccess, self).setUp() + for message in Message.objects.all(): + message.confirmated = True + message.save() def test_access_the_url(self): - # I don't like this test that much - # because it seems to be likely to break if I add more - # public messages - # if it ever fails - # well then I'll fix it url = reverse('search_messages') url += "/" data = {'q': 'Content'} @@ -159,13 +130,10 @@ def test_access_the_url(self): response = self.client.get(url_with_parameters) self.assertEquals(response.status_code, 200) - # the first one the one that says "Public Answer" in example_data.yml - expected_answer = Message.objects.get(id=2) self.assertIn('page', response.context) results = response.context['page'].object_list self.assertGreaterEqual(len(results), 1) - self.assertEquals(results[0].object.id, expected_answer.id) class PerInstanceSearchFormTestCase(SearchIndexTestCase): @@ -175,26 +143,11 @@ def setUp(self): def test_per_instance_search_form(self): form = PerInstanceSearchForm(writeitinstance=self.writeitinstance) - self.assertIsInstance(form, SearchForm) - - ids_of_messages_returned_by_searchqueryset = [] - content_type = ContentType.objects.get(model='message') - - for result in form.searchqueryset: - if result.content_type() == content_type.app_label + ".message": - ids_of_messages_returned_by_searchqueryset.append(result.object.id) - - public_messages = Message.public_objects.filter(writeitinstance=self.writeitinstance) - - ids_of_public_messages_in_writeitinstance = [r.id for r in public_messages] - - self.assertItemsEqual(ids_of_public_messages_in_writeitinstance, ids_of_messages_returned_by_searchqueryset) + self.assertIsInstance(form, Form) def test_per_instance_search_view(self): - view = PerInstanceSearchView() - self.assertIsInstance(view, SearchView) - self.assertEquals(view.form_class, PerInstanceSearchForm) - self.assertEquals(view.template, 'nuntium/instance_search.html') + self.assertTrue(issubclass(PerInstanceSearchView, View)) + self.assertEquals(PerInstanceSearchView.template_name, 'nuntium/instance_search.html') def test_per_instance_search_url(self): url = reverse('instance_search', subdomain=self.writeitinstance.slug) diff --git a/nuntium/urls.py b/nuntium/urls.py index 4c0d4fad..cb91b3be 100644 --- a/nuntium/urls.py +++ b/nuntium/urls.py @@ -19,7 +19,7 @@ url(r'^instances/?$', WriteItInstanceListView.as_view(template_name='nuntium/template_list.html'), name='instance_list'), url(r'^contact/$', ContactUsView.as_view(), name='contact_us'), - url(r'^search/?$', MessageSearchView(), name='search_messages'), + url(r'^search/?$', MessageSearchView.as_view(), name='search_messages'), url(r'^help/(?P\w+)/?$', HelpView.as_view(), name='help_section'), url(r'^help/?$', HelpView.as_view()), diff --git a/nuntium/views.py b/nuntium/views.py index 1265850f..6e5549f0 100644 --- a/nuntium/views.py +++ b/nuntium/views.py @@ -6,14 +6,14 @@ from os.path import dirname import django +from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.db.models import Prefetch from django.views.generic import View, TemplateView, DetailView, RedirectView, ListView from subdomains.utils import reverse from django.http import Http404, HttpResponseRedirect, HttpResponse from formtools.wizard.views import NamedUrlSessionWizardView -from django.shortcuts import get_object_or_404, redirect +from django.shortcuts import get_object_or_404, redirect, render -from haystack.views import SearchView from itertools import chain from django.db.models import Q from instance.models import PopoloPerson, WriteItInstance @@ -258,31 +258,81 @@ def get_redirect_url(self, **kwargs): return url -class MessageSearchView(SearchView): - def __init__(self, *args, **kwargs): - super(MessageSearchView, self).__init__(*args, **kwargs) - self.form_class = MessageSearchForm - self.template = 'nuntium/search.html' +class _SearchResult(object): + def __init__(self, obj): + self.object = obj + self.model_name = obj.__class__.__name__.lower() -class PerInstanceSearchView(SearchView): - def __init__(self, *args, **kwargs): - super(PerInstanceSearchView, self).__init__(*args, **kwargs) - self.form_class = PerInstanceSearchForm - self.template = 'nuntium/instance_search.html' +_RESULTS_PER_PAGE = 20 - def __call__(self, *args, **kwargs): - request = args[0] - self.slug = request.subdomain - return super(PerInstanceSearchView, self).__call__(*args, **kwargs) - def build_form(self, form_kwargs=None): - self.writeitinstance = WriteItInstance.objects.get(slug=self.slug) - if form_kwargs is None: - form_kwargs = {} - form_kwargs['writeitinstance'] = self.writeitinstance +class MessageSearchView(View): + template_name = 'nuntium/search.html' - return super(PerInstanceSearchView, self).build_form(form_kwargs) + def get(self, request, *args, **kwargs): + form = MessageSearchForm(request.GET) + query = '' + results = [] + if form.is_valid(): + query = form.cleaned_data.get('q', '') + if query: + messages = Message.public_objects.filter( + Q(subject__icontains=query) | Q(content__icontains=query) + ) + answers = Answer.objects.filter( + message__in=Message.public_objects.all() + ).filter( + Q(content__icontains=query) | Q(person__name__icontains=query) + ) + results = [_SearchResult(m) for m in messages] + results += [_SearchResult(a) for a in answers] + paginator = Paginator(results, _RESULTS_PER_PAGE) + try: + page = paginator.page(request.GET.get('page', 1)) + except (EmptyPage, PageNotAnInteger): + page = paginator.page(1) + return render(request, self.template_name, { + 'form': form, + 'query': query, + 'page': page, + }) + + +class PerInstanceSearchView(View): + template_name = 'nuntium/instance_search.html' + + def get(self, request, *args, **kwargs): + writeitinstance = get_object_or_404(WriteItInstance, slug=request.subdomain) + form = PerInstanceSearchForm(request.GET, writeitinstance=writeitinstance) + query = '' + results = [] + if form.is_valid(): + query = form.cleaned_data.get('q', '') + if query: + public_messages = Message.public_objects.filter( + writeitinstance=writeitinstance + ) + messages = public_messages.filter( + Q(subject__icontains=query) | Q(content__icontains=query) + ) + answers = Answer.objects.filter( + message__in=public_messages + ).filter( + Q(content__icontains=query) | Q(person__name__icontains=query) + ) + results = [_SearchResult(m) for m in messages] + results += [_SearchResult(a) for a in answers] + paginator = Paginator(results, _RESULTS_PER_PAGE) + try: + page = paginator.page(request.GET.get('page', 1)) + except (EmptyPage, PageNotAnInteger): + page = paginator.page(1) + return render(request, self.template_name, { + 'form': form, + 'query': query, + 'page': page, + }) class MessagesPerPersonView(ListView): diff --git a/requirements.txt b/requirements.txt index 31647a23..6c4c47f0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,6 @@ asn1crypto==0.24.0 backport-collections==0.1 billiard==3.3.0.23 celery==3.1.25 -celery-haystack==0.10 cffi==1.7.0 codecov==2.1.13 contextlib2==0.5.3 @@ -23,7 +22,6 @@ django-dirtyfields==1.0 django-downloadview==1.6 django-extensions==1.6.7 django-formtools==1.0 -django-haystack==2.4.0 django-jsonfield==1.4.1 django-markdown-deux==1.0.5 django-model-utils==3.1.2 @@ -34,7 +32,6 @@ django-pipeline==1.5.4 django-plugins==0.3.0 django-subdomains==2.0.4 django-tastypie==0.13.3 -elasticsearch==1.6.0 email-reply-parser==0.3.0 enum34==1.1.6 flufl.bounce==2.3 diff --git a/setup.py b/setup.py index b1d5a0ef..6a2ede92 100644 --- a/setup.py +++ b/setup.py @@ -11,8 +11,6 @@ 'django-markdown-deux', 'requests', 'django-extensions', -'django-haystack', -'pyelasticsearch', 'celery', 'pyyaml', 'django-celery', diff --git a/writeit/settings.py b/writeit/settings.py index 7ffcc6c7..3edaed35 100644 --- a/writeit/settings.py +++ b/writeit/settings.py @@ -9,8 +9,6 @@ from django.utils.translation import to_locale import environ -from urlparse import urlparse - env = environ.Env() DEBUG = env.bool("DJANGO_DEBUG", False) @@ -200,7 +198,6 @@ "django.contrib.staticfiles", "social.apps.django_app.default", "annoying", - "celery_haystack", "djcelery", "debug_toolbar", "instance", @@ -217,8 +214,6 @@ "tastypie", "markdown_deux", "django_extensions", - # Searching. - "haystack", "pipeline", # Uncomment the next line to enable the admin: "django_admin_bootstrapped", @@ -235,21 +230,6 @@ if TESTING: INSTALLED_APPS += ("django_nose",) -# SEARCH INDEX WITH ELASTICSEARCH -HAYSTACK_SIGNAL_PROCESSOR = "celery_haystack.signals.CelerySignalProcessor" - -ELASTICSEARCH_URL = env.str("ELASTICSEARCH_URL") -ELASTICSEARCH_INDEX = env.str("ELASTICSEARCH_INDEX") - -HAYSTACK_CONNECTIONS = { - "default": { - "ENGINE": "haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine", - "URL": ELASTICSEARCH_URL, - "PORT": urlparse(os.environ.get("ELASTICSEARCH_URL")).port, - "INDEX_NAME": ELASTICSEARCH_INDEX, - }, -} - # Testing with django TEST_RUNNER = "global_test_case.WriteItTestRunner" @@ -415,12 +395,6 @@ CELERY_TIMEZONE = TIME_ZONE CELERY_ENABLE_UTC = True CELERY_CREATE_MISSING_QUEUES = True -CELERY_HAYSTACK_TRANSACTION_SAFE = True -CELERY_HAYSTACK_DEFAULT_ALIAS = None -CELERY_HAYSTACK_RETRY_DELAY = 5 * 60 -CELERY_HAYSTACK_MAX_RETRIES = 1 -CELERY_HAYSTACK_DEFAULT_TASK = "celery_haystack.tasks.CeleryHaystackSignalHandler" - # These can be set independently, but most often one will be set to True and # the other to False. Setting both to the same boolean value will have # undefined behaviour. @@ -428,9 +402,7 @@ API_BASED = False if TESTING: - LOCAL_ELASTICSEARCH = True CELERY_ALWAYS_EAGER = True - ELASTICSEARCH_INDEX += "-test" USE_X_FORWARDED_HOST = True SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")