From 83b799276e6325f65d1c3502946292f38ce7421a Mon Sep 17 00:00:00 2001 From: Radek Czajka Date: Fri, 14 May 2010 14:59:38 +0200 Subject: [PATCH 1/1] search for exact matches first, fixing #533 --- apps/catalogue/views.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/apps/catalogue/views.py b/apps/catalogue/views.py index 126b00940..460111789 100644 --- a/apps/catalogue/views.py +++ b/apps/catalogue/views.py @@ -171,7 +171,7 @@ def book_text(request, slug): # = Search = # ========== def _word_starts_with(name, prefix): - """returns a Q object gettings models having `name` contain a word + """returns a Q object getting models having `name` contain a word starting with `prefix` """ kwargs = {} @@ -190,6 +190,19 @@ def _word_starts_with(name, prefix): return Q(**kwargs) +def _tags_exact_matches(prefix, user): + book_stubs = models.BookStub.objects.filter(title__iexact = prefix) + books = models.Book.objects.filter(title__iexact = prefix) + book_stubs = filter(lambda x: x not in books, book_stubs) + tags = models.Tag.objects.filter(name__iexact = prefix) + if user.is_authenticated(): + tags = tags.filter(~Q(category='book') & (~Q(category='set') | Q(user=user))) + else: + tags = tags.filter(~Q(category='book') & ~Q(category='set')) + + return list(books) + list(tags) + list(book_stubs) + + def _tags_starting_with(prefix, user): book_stubs = models.BookStub.objects.filter(_word_starts_with('title', prefix)) books = models.Book.objects.filter(_word_starts_with('title', prefix)) @@ -218,7 +231,10 @@ def search(request): kwargs={'tags': '/'.join(tag.slug for tag in tag_list)} )) - result = _tags_starting_with(prefix, request.user) + result = _tags_exact_matches(prefix, request.user) + if (not result): + result = _tags_starting_with(prefix, request.user) + if len(result) > 0: tag = result[0] if isinstance(tag, models.Book) or isinstance(tag, models.BookStub): -- 2.20.1