Commit ade47343 by Bill DeRusha

Merge pull request #9661 from edx/bderusha/teams-search-index

Add more defensive code around elasticsearch connection
parents 9badf24a 62ef4b5b
...@@ -10,6 +10,7 @@ import ddt ...@@ -10,6 +10,7 @@ import ddt
from flaky import flaky from flaky import flaky
from nose.plugins.attrib import attr from nose.plugins.attrib import attr
from uuid import uuid4 from uuid import uuid4
from unittest import skip
from ..helpers import UniqueCourseTest, EventsTestMixin from ..helpers import UniqueCourseTest, EventsTestMixin
from ...fixtures import LMS_BASE_URL from ...fixtures import LMS_BASE_URL
...@@ -705,6 +706,7 @@ class BrowseTeamsWithinTopicTest(TeamsTabBase): ...@@ -705,6 +706,7 @@ class BrowseTeamsWithinTopicTest(TeamsTabBase):
self.browse_teams_page.click_browse_all_teams_link() self.browse_teams_page.click_browse_all_teams_link()
self.assertTrue(self.topics_page.is_browser_on_page()) self.assertTrue(self.topics_page.is_browser_on_page())
@skip('Disabled until search connectivity issues are resolved, see TNL-3206')
def test_search(self): def test_search(self):
""" """
Scenario: User should be able to search for a team Scenario: User should be able to search for a team
......
...@@ -16,6 +16,11 @@ class AlreadyOnTeamInCourse(TeamAPIRequestError): ...@@ -16,6 +16,11 @@ class AlreadyOnTeamInCourse(TeamAPIRequestError):
pass pass
class ElasticSearchConnectionError(TeamAPIRequestError):
"""System was unable to connect to the configured elasticsearch instance"""
pass
class ImmutableMembershipFieldException(Exception): class ImmutableMembershipFieldException(Exception):
"""An attempt was made to change an immutable field on a CourseTeamMembership model""" """An attempt was made to change an immutable field on a CourseTeamMembership model"""
pass pass
""" Search index used to load data into elasticsearch""" """ Search index used to load data into elasticsearch"""
import logging
from requests import ConnectionError
from django.conf import settings from django.conf import settings
from django.db.models.signals import post_save from django.db.models.signals import post_save
from django.dispatch import receiver from django.dispatch import receiver
from search.search_engine_base import SearchEngine from search.search_engine_base import SearchEngine
from .errors import ElasticSearchConnectionError
from .serializers import CourseTeamSerializer, CourseTeam from .serializers import CourseTeamSerializer, CourseTeam
...@@ -78,7 +82,11 @@ class CourseTeamIndexer(object): ...@@ -78,7 +82,11 @@ class CourseTeamIndexer(object):
Return course team search engine (if feature is enabled). Return course team search engine (if feature is enabled).
""" """
if cls.search_is_enabled(): if cls.search_is_enabled():
return SearchEngine.get_search_engine(index=cls.INDEX_NAME) try:
return SearchEngine.get_search_engine(index=cls.INDEX_NAME)
except ConnectionError as err:
logging.error("Error connecting to elasticsearch: %s", err)
raise ElasticSearchConnectionError
@classmethod @classmethod
def search_is_enabled(cls): def search_is_enabled(cls):
...@@ -93,4 +101,7 @@ def course_team_post_save_callback(**kwargs): ...@@ -93,4 +101,7 @@ def course_team_post_save_callback(**kwargs):
""" """
Reindex object after save. Reindex object after save.
""" """
CourseTeamIndexer.index(kwargs['instance']) try:
CourseTeamIndexer.index(kwargs['instance'])
except ElasticSearchConnectionError:
pass
...@@ -134,7 +134,7 @@ define([ ...@@ -134,7 +134,7 @@ define([
)); ));
}; };
it('can search teams', function () { xit('can search teams', function () {
var requests = AjaxHelpers.requests(this), var requests = AjaxHelpers.requests(this),
teamsTabView = createTeamsTabView(); teamsTabView = createTeamsTabView();
teamsTabView.browseTopic(TeamSpecHelpers.testTopicID); teamsTabView.browseTopic(TeamSpecHelpers.testTopicID);
...@@ -154,7 +154,7 @@ define([ ...@@ -154,7 +154,7 @@ define([
expect(teamsTabView.$('.page-description').text()).toBe('Showing results for "foo"'); expect(teamsTabView.$('.page-description').text()).toBe('Showing results for "foo"');
}); });
it('can clear a search', function () { xit('can clear a search', function () {
var requests = AjaxHelpers.requests(this), var requests = AjaxHelpers.requests(this),
teamsTabView = createTeamsTabView(); teamsTabView = createTeamsTabView();
teamsTabView.browseTopic(TeamSpecHelpers.testTopicID); teamsTabView.browseTopic(TeamSpecHelpers.testTopicID);
...@@ -177,7 +177,7 @@ define([ ...@@ -177,7 +177,7 @@ define([
expect(teamsTabView.$('.page-description').text()).toBe('Test description 1'); expect(teamsTabView.$('.page-description').text()).toBe('Test description 1');
}); });
it('clears the search when navigating away and then back', function () { xit('clears the search when navigating away and then back', function () {
var requests = AjaxHelpers.requests(this), var requests = AjaxHelpers.requests(this),
teamsTabView = createTeamsTabView(); teamsTabView = createTeamsTabView();
teamsTabView.browseTopic(TeamSpecHelpers.testTopicID); teamsTabView.browseTopic(TeamSpecHelpers.testTopicID);
...@@ -199,7 +199,7 @@ define([ ...@@ -199,7 +199,7 @@ define([
expect(teamsTabView.$('.page-description').text()).toBe('Test description 1'); expect(teamsTabView.$('.page-description').text()).toBe('Test description 1');
}); });
it('does not switch to showing results when the search returns an error', function () { xit('does not switch to showing results when the search returns an error', function () {
var requests = AjaxHelpers.requests(this), var requests = AjaxHelpers.requests(this),
teamsTabView = createTeamsTabView(); teamsTabView = createTeamsTabView();
teamsTabView.browseTopic(TeamSpecHelpers.testTopicID); teamsTabView.browseTopic(TeamSpecHelpers.testTopicID);
......
...@@ -66,7 +66,7 @@ define([ ...@@ -66,7 +66,7 @@ define([
expect(Backbone.history.navigate.calls[0].args).toContain('browse'); expect(Backbone.history.navigate.calls[0].args).toContain('browse');
}); });
it('gives the search field focus when clicking on the search teams link', function () { xit('gives the search field focus when clicking on the search teams link', function () {
var emptyMembership = TeamSpecHelpers.createMockTeamMemberships([]), var emptyMembership = TeamSpecHelpers.createMockTeamMemberships([]),
teamsView = createTopicTeamsView({ teamMemberships: emptyMembership }); teamsView = createTopicTeamsView({ teamMemberships: emptyMembership });
spyOn($.fn, 'focus').andCallThrough(); spyOn($.fn, 'focus').andCallThrough();
......
...@@ -303,7 +303,7 @@ ...@@ -303,7 +303,7 @@
viewWithHeader = this.createViewWithHeader({ viewWithHeader = this.createViewWithHeader({
subject: topic, subject: topic,
mainView: teamsView, mainView: teamsView,
headerActionsView: searchFieldView, headerActionsView: null, // TODO: add back SearchFieldView when search is enabled
title: options.title, title: options.title,
description: options.description, description: options.description,
breadcrumbs: options.breadcrumbs breadcrumbs: options.breadcrumbs
......
...@@ -57,13 +57,16 @@ ...@@ -57,13 +57,16 @@
}, },
searchTeams: function (event) { searchTeams: function (event) {
var searchField = $('.page-header-search .search-field'); //var searchField = $('.page-header-search .search-field');
event.preventDefault(); event.preventDefault();
searchField.focus(); //searchField.focus();
searchField.select(); //searchField.select();
$('html, body').animate({ //$('html, body').animate({
scrollTop: 0 // scrollTop: 0
}, 500); //}, 500);
// TODO! Will navigate to correct place once required functionality is available
Backbone.history.navigate('browse', {trigger: true});
}, },
showCreateTeamForm: function (event) { showCreateTeamForm: function (event) {
......
...@@ -52,7 +52,7 @@ from .serializers import ( ...@@ -52,7 +52,7 @@ from .serializers import (
add_team_count add_team_count
) )
from .search_indexes import CourseTeamIndexer from .search_indexes import CourseTeamIndexer
from .errors import AlreadyOnTeamInCourse, NotEnrolledInCourseForTeam from .errors import AlreadyOnTeamInCourse, NotEnrolledInCourseForTeam, ElasticSearchConnectionError
TEAM_MEMBERSHIPS_PER_PAGE = 2 TEAM_MEMBERSHIPS_PER_PAGE = 2
TOPICS_PER_PAGE = 12 TOPICS_PER_PAGE = 12
...@@ -330,7 +330,13 @@ class TeamsListView(ExpandableFieldViewMixin, GenericAPIView): ...@@ -330,7 +330,13 @@ class TeamsListView(ExpandableFieldViewMixin, GenericAPIView):
result_filter.update({'topic_id': request.QUERY_PARAMS['topic_id']}) result_filter.update({'topic_id': request.QUERY_PARAMS['topic_id']})
if text_search and CourseTeamIndexer.search_is_enabled(): if text_search and CourseTeamIndexer.search_is_enabled():
search_engine = CourseTeamIndexer.engine() try:
search_engine = CourseTeamIndexer.engine()
except ElasticSearchConnectionError:
return Response(
build_api_error(ugettext_noop('Error connecting to elasticsearch')),
status=status.HTTP_400_BAD_REQUEST
)
result_filter.update({'course_id': course_id_string}) result_filter.update({'course_id': course_id_string})
search_results = search_engine.search( search_results = search_engine.search(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment