def test_cron_updates_counts(self): q = question(save=True) self.refresh() eq_(q.num_votes_past_week, 0) # NB: Need to call .values_dict() here and later otherwise we # get a Question object which has data from the database and # not the index. document = (QuestionMappingType.search() .values_dict('question_num_votes_past_week') .filter(id=q.id))[0] eq_(document['question_num_votes_past_week'], 0) vote = questionvote(question=q, anonymous_id='abc123') vote.save() q.num_votes_past_week = 0 q.save() update_weekly_votes() self.refresh() q = Question.objects.get(pk=q.pk) eq_(1, q.num_votes_past_week) document = (QuestionMappingType.search() .values_dict('question_num_votes_past_week') .filter(id=q.id))[0] eq_(document['question_num_votes_past_week'], 1)
def test_cron_updates_counts(self): q = question(save=True) self.refresh() eq_(q.num_votes_past_week, 0) # NB: Need to call .values_dict() here and later otherwise we # get a Question object which has data from the database and # not the index. document = (QuestionMappingType.search().values_dict( 'question_num_votes_past_week').filter(id=q.id))[0] eq_(document['question_num_votes_past_week'], 0) vote = questionvote(question=q, anonymous_id='abc123') vote.save() q.num_votes_past_week = 0 q.save() update_weekly_votes() self.refresh() q = Question.objects.get(pk=q.pk) eq_(1, q.num_votes_past_week) document = (QuestionMappingType.search().values_dict( 'question_num_votes_past_week').filter(id=q.id))[0] eq_(document['question_num_votes_past_week'], 1)
def test_questions_tags(self): """Make sure that adding tags to a Question causes it to refresh the index. """ tag = u'hiphop' eq_(QuestionMappingType.search().filter(question_tag=tag).count(), 0) q = question(save=True) self.refresh() eq_(QuestionMappingType.search().filter(question_tag=tag).count(), 0) q.tags.add(tag) self.refresh() eq_(QuestionMappingType.search().filter(question_tag=tag).count(), 1) q.tags.remove(tag) self.refresh() eq_(QuestionMappingType.search().filter(question_tag=tag).count(), 0)
def test_added(self): search = QuestionMappingType.search() # Create a question--that adds one document to the index. q = question(title=u'Does this test work?', save=True) self.refresh() query = dict(('%s__text' % field, 'test') for field in QuestionMappingType.get_query_fields()) eq_(search.query(should=True, **query).count(), 1) # Create an answer for the question. It shouldn't be searchable # until the answer is saved. a = answer(content=u'There\'s only one way to find out!', question=q) self.refresh() query = dict(('%s__text' % field, 'only') for field in QuestionMappingType.get_query_fields()) eq_(search.query(should=True, **query).count(), 0) a.save() self.refresh() query = dict(('%s__text' % field, 'only') for field in QuestionMappingType.get_query_fields()) eq_(search.query(should=True, **query).count(), 1) # Make sure that there's only one question document in the # index--creating an answer should have updated the existing # one. eq_(search.count(), 1)
def test_question_no_answers_deleted(self): search = QuestionMappingType.search() q = question(title=u'Does this work?', save=True) self.refresh() eq_(search.query(question_title__text='work').count(), 1) q.delete() self.refresh() eq_(search.query(question_title__text='work').count(), 0)
def test_question_products(self): """Make sure that adding products to a Question causes it to refresh the index. """ p = product(slug=u'desktop', save=True) eq_(QuestionMappingType.search().filter(product=p.slug).count(), 0) q = question(save=True) self.refresh() eq_(QuestionMappingType.search().filter(product=p.slug).count(), 0) q.products.add(p) self.refresh() eq_(QuestionMappingType.search().filter(product=p.slug).count(), 1) q.products.remove(p) self.refresh() # Make sure the question itself is still there and that we didn't # accidentally delete it through screwed up signal handling: eq_(QuestionMappingType.search().filter().count(), 1) eq_(QuestionMappingType.search().filter(product=p.slug).count(), 0)
def test_question_topics(self): """Make sure that adding topics to a Question causes it to refresh the index. """ t = topic(slug=u'hiphop', save=True) eq_(QuestionMappingType.search().filter(topic=t.slug).count(), 0) q = question(save=True) self.refresh() eq_(QuestionMappingType.search().filter(topic=t.slug).count(), 0) q.topics.add(t) self.refresh() eq_(QuestionMappingType.search().filter(topic=t.slug).count(), 1) q.topics.clear() self.refresh() # Make sure the question itself is still there and that we didn't # accidentally delete it through screwed up signal handling: eq_(QuestionMappingType.search().filter().count(), 1) eq_(QuestionMappingType.search().filter(topic=t.slug).count(), 0)
def test_question_questionvote(self): search = QuestionMappingType.search() # Create a question and verify it doesn't show up in a # query for num_votes__gt=0. q = question(title=u'model makers will inherit the earth', save=True) self.refresh() eq_(search.filter(question_num_votes__gt=0).count(), 0) # Add a QuestionVote--it should show up now. questionvote(question=q, save=True) self.refresh() eq_(search.filter(question_num_votes__gt=0).count(), 1)
def test_case_insensitive_search(self): """Ensure the default searcher is case insensitive.""" answervote( answer=answer(question=question(title='lolrus', content='I am the lolrus.', save=True), save=True), helpful=True).save() self.refresh() result = QuestionMappingType.search().query( question_title__text='LOLRUS', question_content__text='LOLRUS') assert result.count() > 0
def suggestions(request): """A simple search view that returns OpenSearch suggestions.""" mimetype = 'application/x-suggestions+json' term = request.GET.get('q') if not term: return HttpResponseBadRequest(mimetype=mimetype) site = Site.objects.get_current() locale = locale_or_default(request.LANGUAGE_CODE) try: query = dict(('%s__text' % field, term) for field in DocumentMappingType.get_query_fields()) wiki_s = (DocumentMappingType.search() .filter(document_is_archived=False) .filter(document_locale=locale) .values_dict('document_title', 'url') .query(or_=query)[:5]) query = dict(('%s__text' % field, term) for field in QuestionMappingType.get_query_fields()) question_s = (QuestionMappingType.search() .filter(question_has_helpful=True) .values_dict('question_title', 'url') .query(or_=query)[:5]) results = list(chain(question_s, wiki_s)) except ES_EXCEPTIONS: # If we have ES problems, we just send back an empty result # set. results = [] urlize = lambda r: u'https://%s%s' % (site, r['url']) titleize = lambda r: (r['document_title'] if 'document_title' in r else r['question_title']) data = [term, [titleize(r) for r in results], [], [urlize(r) for r in results]] return HttpResponse(json.dumps(data), mimetype=mimetype)
def test_question_one_answer_deleted(self): search = QuestionMappingType.search() q = question(title=u'are model makers the new pink?', save=True) a = answer(content=u'yes.', question=q, save=True) self.refresh() # Question and its answers are a single document--so the # index count should be only 1. eq_(search.query(question_title__text='pink').count(), 1) # After deleting the answer, the question document should # remain. a.delete() self.refresh() eq_(search.query(question_title__text='pink').count(), 1) # Delete the question and it should be removed from the # index. q.delete() self.refresh() eq_(search.query(question_title__text='pink').count(), 0)