This commit is contained in:
slav0nic 2012-06-05 11:59:41 +03:00
commit f1fc579732
2 changed files with 35 additions and 14 deletions
djangobb_forum

View file

@ -221,3 +221,28 @@ def convert_text_to_html(text, markup):
else:
raise Exception('Invalid markup property: %s' % markup)
return urlize(text)
class TopicFromPostResult(object):
"""
Custom Result object to return topics from a post search.
This function uses a generator to return topic objects from
results given by haystack on a post query. This eliminates
loading a large array of topic objects into memory.
"""
def __init__(self, posts):
self.posts = posts
def __len__(self):
return len(self.posts)
def __getitem__(self, key):
if isinstance(key, slice):
return (self.posts[i].object.topic
for i in xrange(*key.indices(len(self))))
elif isinstance(key, int):
return self.posts[key].object.topic
raise TypeError('unknown type in key for __getitem__')

View file

@ -22,7 +22,7 @@ from djangobb_forum.forms import AddPostForm, EditPostForm, UserSearchForm,\
DisplayProfileForm, PrivacyProfileForm, ReportForm, UploadAvatarForm
from djangobb_forum.templatetags import forum_extras
from djangobb_forum import settings as forum_settings
from djangobb_forum.util import smiles, convert_text_to_html
from djangobb_forum.util import smiles, convert_text_to_html, TopicFromPostResult
from djangobb_forum.templatetags.forum_extras import forum_moderated_by
from haystack.query import SearchQuerySet, SQ
@ -162,6 +162,11 @@ def search(request):
elif search_in == 'topic':
query = query.filter(topic=keywords)
# add exlusions for categories user does not have access too
for category in Category.objects.all():
if not category.has_access(request.user):
query = query.exclude(category=category)
order = {'0': 'created',
'1': 'author',
'2': 'topic',
@ -172,21 +177,12 @@ def search(request):
posts = query.order_by(order)
if 'topics' in request.GET['show_as']:
topics = []
topics_to_exclude = SQ()
#TODO: rewrite
for post in posts:
if post.object.topic not in topics:
if post.object.topic.forum.category.has_access(request.user):
topics.append(post.object.topic)
else:
topics_to_exclude |= SQ(topic=post.object.topic)
if topics_to_exclude:
posts = posts.exclude(topics_to_exclude)
return render(request, 'djangobb_forum/search_topics.html', {'results': topics})
return render(request, 'djangobb_forum/search_topics.html', {
'results': TopicFromPostResult(posts)
})
elif 'posts' in request.GET['show_as']:
return render(request, 'djangobb_forum/search_posts.html', {'results': posts})
return render(request, 'djangobb_forum/search_topics.html', {'results': topics})
else:
form = PostSearchForm()