return snips
- def hint_tags(self, query, pdcounter=True, prefix=True):
- """
- Return auto-complete hints for tags
- using prefix search.
- """
- q = self.index.Q()
- query = query.strip()
- for field in ['tag_name', 'tag_name_pl']:
- if prefix:
- q |= self.index.Q(**{field: query + "*"})
- else:
- q |= self.make_term_query(query, field=field)
- qu = self.index.query(q)
-
- return self.search_tags(qu, pdcounter=pdcounter)
-
- def search_tags(self, query, filters=None, pdcounter=False):
- """
- Search for Tag objects using query.
- """
- if not filters:
- filters = []
- if not pdcounter:
- filters.append(~self.index.Q(is_pdcounter=True))
- res = self.apply_filters(query, filters).execute()
-
- tags = []
- pd_tags = []
-
- for doc in res:
- is_pdcounter = doc.get('is_pdcounter', False)
- category = doc.get('tag_category')
- try:
- if is_pdcounter:
- if category == 'pd_author':
- tag = PDCounterAuthor.objects.get(id=doc.get('tag_id'))
- else: # category == 'pd_book':
- tag = PDCounterBook.objects.get(id=doc.get('tag_id'))
- tag.category = 'pd_book' # make it look more lik a tag.
- pd_tags.append(tag)
- else:
- tag = catalogue.models.Tag.objects.get(id=doc.get("tag_id"))
- tags.append(tag)
-
- except catalogue.models.Tag.DoesNotExist:
- pass
- except PDCounterAuthor.DoesNotExist:
- pass
- except PDCounterBook.DoesNotExist:
- pass
-
- tags_slugs = set(map(lambda t: t.slug, tags))
- tags = tags + filter(lambda t: t.slug not in tags_slugs, pd_tags)
-
- log.debug('search_tags: %s' % tags)
-
- return tags
-
- def hint_books(self, query, prefix=True):
- """
- Returns auto-complete hints for book titles
- Because we do not index 'pseudo' title-tags.
- Prefix search.
- """
- q = self.index.Q()
- query = query.strip()
- if prefix:
- q |= self.index.Q(title=query + "*")
- q |= self.index.Q(title_orig=query + "*")
- else:
- q |= self.make_term_query(query, field='title')
- q |= self.make_term_query(query, field='title_orig')
- qu = self.index.query(q)
- only_books = self.index.Q(is_book=True)
- return self.search_books(qu, [only_books])
-
- def search_books(self, query, filters=None, max_results=10):
- """
- Searches for Book objects using query
- """
- bks = []
- bks_found = set()
- query = query.query(is_book=True)
- res = self.apply_filters(query, filters).field_limit(['book_id'])
- for r in res:
- try:
- bid = r['book_id']
- if bid not in bks_found:
- bks.append(catalogue.models.Book.objects.get(id=bid))
- bks_found.add(bid)
- except catalogue.models.Book.DoesNotExist:
- pass
- return bks
-
@staticmethod
def apply_filters(query, filters):
"""
results.append(res)
return results
- # WTF
- def search_books(self, query, filters=None, max_results=10):
- return self._find_some_books(max_results=max_results)
-
def search_everywhere(self, searched, query_terms=None):
return []
- def hint_tags(self, query, pdcounter=True, prefix=True):
- return Tag.objects.exclude(category='set').order_by('?')[:randint(1, 10)]
-
- def hint_books(self, prefix):
- return Book.objects.order_by('?')[:randint(1, 10)]
self.do_anusie = Book.from_xml_file(
get_fixture('fraszka-do-anusie.xml', catalogue))
- def test_search_perfect_book_author(self):
- books = self.search.search_books(self.search.index.query(authors=u"sęp szarzyński"))
- assert len(books) == 1
- assert books[0].id == self.do_anusie.id
-
- # here we lack slop functionality as well
- def test_search_perfect_book_title(self):
- books = self.search.search_books(self.search.index.query(title=u"fraszka do anusie"))
- assert len(books) == 1
- assert books[0].id == self.do_anusie.id
-
# TODO: Add slop option to sunburnt
# def test_search_perfect_parts(self):
# books = self.search.search_phrase(u"Jakoż hamować")