Merge pull request #9661 from edx/bderusha/teams-search-index
Add more defensive code around elasticsearch connection
This commit is contained in:
@@ -10,6 +10,7 @@ import ddt
|
||||
from flaky import flaky
|
||||
from nose.plugins.attrib import attr
|
||||
from uuid import uuid4
|
||||
from unittest import skip
|
||||
|
||||
from ..helpers import UniqueCourseTest, EventsTestMixin
|
||||
from ...fixtures import LMS_BASE_URL
|
||||
@@ -705,6 +706,7 @@ class BrowseTeamsWithinTopicTest(TeamsTabBase):
|
||||
self.browse_teams_page.click_browse_all_teams_link()
|
||||
self.assertTrue(self.topics_page.is_browser_on_page())
|
||||
|
||||
@skip('Disabled until search connectivity issues are resolved, see TNL-3206')
|
||||
def test_search(self):
|
||||
"""
|
||||
Scenario: User should be able to search for a team
|
||||
|
||||
@@ -16,6 +16,11 @@ class AlreadyOnTeamInCourse(TeamAPIRequestError):
|
||||
pass
|
||||
|
||||
|
||||
class ElasticSearchConnectionError(TeamAPIRequestError):
|
||||
"""System was unable to connect to the configured elasticsearch instance"""
|
||||
pass
|
||||
|
||||
|
||||
class ImmutableMembershipFieldException(Exception):
|
||||
"""An attempt was made to change an immutable field on a CourseTeamMembership model"""
|
||||
pass
|
||||
|
||||
@@ -1,11 +1,15 @@
|
||||
""" Search index used to load data into elasticsearch"""
|
||||
|
||||
import logging
|
||||
from requests import ConnectionError
|
||||
|
||||
from django.conf import settings
|
||||
from django.db.models.signals import post_save
|
||||
from django.dispatch import receiver
|
||||
|
||||
from search.search_engine_base import SearchEngine
|
||||
|
||||
from .errors import ElasticSearchConnectionError
|
||||
from .serializers import CourseTeamSerializer, CourseTeam
|
||||
|
||||
|
||||
@@ -78,7 +82,11 @@ class CourseTeamIndexer(object):
|
||||
Return course team search engine (if feature 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
|
||||
def search_is_enabled(cls):
|
||||
@@ -93,4 +101,7 @@ def course_team_post_save_callback(**kwargs):
|
||||
"""
|
||||
Reindex object after save.
|
||||
"""
|
||||
CourseTeamIndexer.index(kwargs['instance'])
|
||||
try:
|
||||
CourseTeamIndexer.index(kwargs['instance'])
|
||||
except ElasticSearchConnectionError:
|
||||
pass
|
||||
|
||||
@@ -134,7 +134,7 @@ define([
|
||||
));
|
||||
};
|
||||
|
||||
it('can search teams', function () {
|
||||
xit('can search teams', function () {
|
||||
var requests = AjaxHelpers.requests(this),
|
||||
teamsTabView = createTeamsTabView();
|
||||
teamsTabView.browseTopic(TeamSpecHelpers.testTopicID);
|
||||
@@ -154,7 +154,7 @@ define([
|
||||
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),
|
||||
teamsTabView = createTeamsTabView();
|
||||
teamsTabView.browseTopic(TeamSpecHelpers.testTopicID);
|
||||
@@ -177,7 +177,7 @@ define([
|
||||
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),
|
||||
teamsTabView = createTeamsTabView();
|
||||
teamsTabView.browseTopic(TeamSpecHelpers.testTopicID);
|
||||
@@ -199,7 +199,7 @@ define([
|
||||
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),
|
||||
teamsTabView = createTeamsTabView();
|
||||
teamsTabView.browseTopic(TeamSpecHelpers.testTopicID);
|
||||
|
||||
@@ -66,7 +66,7 @@ define([
|
||||
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([]),
|
||||
teamsView = createTopicTeamsView({ teamMemberships: emptyMembership });
|
||||
spyOn($.fn, 'focus').andCallThrough();
|
||||
|
||||
@@ -303,7 +303,7 @@
|
||||
viewWithHeader = this.createViewWithHeader({
|
||||
subject: topic,
|
||||
mainView: teamsView,
|
||||
headerActionsView: searchFieldView,
|
||||
headerActionsView: null, // TODO: add back SearchFieldView when search is enabled
|
||||
title: options.title,
|
||||
description: options.description,
|
||||
breadcrumbs: options.breadcrumbs
|
||||
|
||||
@@ -57,13 +57,16 @@
|
||||
},
|
||||
|
||||
searchTeams: function (event) {
|
||||
var searchField = $('.page-header-search .search-field');
|
||||
//var searchField = $('.page-header-search .search-field');
|
||||
event.preventDefault();
|
||||
searchField.focus();
|
||||
searchField.select();
|
||||
$('html, body').animate({
|
||||
scrollTop: 0
|
||||
}, 500);
|
||||
//searchField.focus();
|
||||
//searchField.select();
|
||||
//$('html, body').animate({
|
||||
// scrollTop: 0
|
||||
//}, 500);
|
||||
|
||||
// TODO! Will navigate to correct place once required functionality is available
|
||||
Backbone.history.navigate('browse', {trigger: true});
|
||||
},
|
||||
|
||||
showCreateTeamForm: function (event) {
|
||||
|
||||
@@ -52,7 +52,7 @@ from .serializers import (
|
||||
add_team_count
|
||||
)
|
||||
from .search_indexes import CourseTeamIndexer
|
||||
from .errors import AlreadyOnTeamInCourse, NotEnrolledInCourseForTeam
|
||||
from .errors import AlreadyOnTeamInCourse, NotEnrolledInCourseForTeam, ElasticSearchConnectionError
|
||||
|
||||
TEAM_MEMBERSHIPS_PER_PAGE = 2
|
||||
TOPICS_PER_PAGE = 12
|
||||
@@ -330,7 +330,13 @@ class TeamsListView(ExpandableFieldViewMixin, GenericAPIView):
|
||||
result_filter.update({'topic_id': request.QUERY_PARAMS['topic_id']})
|
||||
|
||||
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})
|
||||
|
||||
search_results = search_engine.search(
|
||||
|
||||
Reference in New Issue
Block a user