def search(request):
    '''View for a simple keyword search on TEI Groupsheet content only.'''
    form = KeywordSearchForm(request.GET)

    context = {'form': form, 'page_rdf_type': 'schema:SearchResultsPage'}
    if form.is_valid():
        keywords = form.cleaned_data['keywords']
        # pagination todo (?)
        # page = request.REQUEST.get('page', 1)

        try:
            results = TeiGroupSheet.objects \
                                .filter(fulltext_terms=keywords) \
                                .order_by('-fulltext_score') \
                                .also('fulltext_score')
            context.update({'documents': results, 'keywords': keywords})
            # calculate total to trigger exist query so error can be caught
            results.count()
        except ExistDBException as err:
            logger.error('eXist query error: %s', err)
            context['query_error'] = True

    return render(request, 'groupsheets/search_results.html',
                  context)
    def test_keyword_clean(self):
        term_phrase = 'term1 term2 "exact phrase"'
        form = KeywordSearchForm({'keywords': term_phrase})
        self.assertTrue(form.is_valid())
        self.assertEqual(term_phrase, form.cleaned_data['keywords'])
        # wildcards are fine
        term_phrase = 'term?1 term* "exact phrase"'
        form = KeywordSearchForm({'keywords': term_phrase})
        self.assertTrue(form.is_valid())
        self.assertEqual(term_phrase, form.cleaned_data['keywords'])

        # for an incomplete exact phrase, the quote will be ignored
        incomplete_phrase = 'term1 term2 "exact phrase'
        form = KeywordSearchForm({'keywords': incomplete_phrase})
        self.assertTrue(form.is_valid())
        self.assertEqual(incomplete_phrase.replace('"', ''), form.cleaned_data['keywords'])
        # works with multiple phrases or terms
        incomplete_phrase = 'term1 term2 "exact phrase1" term3 "inexact phrase'
        cleaned_incomplete_phrase = 'term1 term2 "exact phrase1" term3 inexact phrase'
        form = KeywordSearchForm({'keywords': incomplete_phrase})
        self.assertTrue(form.is_valid())
        self.assertEqual(cleaned_incomplete_phrase,
                         form.cleaned_data['keywords'])