merge for #182
This commit is contained in:
commit
f1fc579732
2 changed files with 35 additions and 14 deletions
|
@ -221,3 +221,28 @@ def convert_text_to_html(text, markup):
|
||||||
else:
|
else:
|
||||||
raise Exception('Invalid markup property: %s' % markup)
|
raise Exception('Invalid markup property: %s' % markup)
|
||||||
return urlize(text)
|
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__')
|
||||||
|
|
|
@ -22,7 +22,7 @@ from djangobb_forum.forms import AddPostForm, EditPostForm, UserSearchForm,\
|
||||||
DisplayProfileForm, PrivacyProfileForm, ReportForm, UploadAvatarForm
|
DisplayProfileForm, PrivacyProfileForm, ReportForm, UploadAvatarForm
|
||||||
from djangobb_forum.templatetags import forum_extras
|
from djangobb_forum.templatetags import forum_extras
|
||||||
from djangobb_forum import settings as forum_settings
|
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 djangobb_forum.templatetags.forum_extras import forum_moderated_by
|
||||||
|
|
||||||
from haystack.query import SearchQuerySet, SQ
|
from haystack.query import SearchQuerySet, SQ
|
||||||
|
@ -162,6 +162,11 @@ def search(request):
|
||||||
elif search_in == 'topic':
|
elif search_in == 'topic':
|
||||||
query = query.filter(topic=keywords)
|
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',
|
order = {'0': 'created',
|
||||||
'1': 'author',
|
'1': 'author',
|
||||||
'2': 'topic',
|
'2': 'topic',
|
||||||
|
@ -172,21 +177,12 @@ def search(request):
|
||||||
posts = query.order_by(order)
|
posts = query.order_by(order)
|
||||||
|
|
||||||
if 'topics' in request.GET['show_as']:
|
if 'topics' in request.GET['show_as']:
|
||||||
topics = []
|
return render(request, 'djangobb_forum/search_topics.html', {
|
||||||
topics_to_exclude = SQ()
|
'results': TopicFromPostResult(posts)
|
||||||
#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})
|
|
||||||
elif 'posts' in request.GET['show_as']:
|
elif 'posts' in request.GET['show_as']:
|
||||||
return render(request, 'djangobb_forum/search_posts.html', {'results': posts})
|
return render(request, 'djangobb_forum/search_posts.html', {'results': posts})
|
||||||
|
|
||||||
return render(request, 'djangobb_forum/search_topics.html', {'results': topics})
|
return render(request, 'djangobb_forum/search_topics.html', {'results': topics})
|
||||||
else:
|
else:
|
||||||
form = PostSearchForm()
|
form = PostSearchForm()
|
||||||
|
|
Reference in a new issue