Skip to content
This repository was archived by the owner on Jan 15, 2019. It is now read-only.

Commit 2b6401f

Browse files
committed
adding question list tags, login redirect instead of 404 (closes #30) and can_view on prefetch_related (closes #31)
1 parent ca15bc1 commit 2b6401f

File tree

8 files changed

+51
-23
lines changed

8 files changed

+51
-23
lines changed

knowledge/managers.py

+8-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33

44

55
class QuestionManager(models.Manager):
6+
# def get_query_set(self, *args, **kwargs):
7+
# return super(QuestionManager, self).get_query_set(*args, **kwargs)
8+
69
def can_view(self, user):
710
qs = super(QuestionManager, self).get_query_set()\
811
.select_related('user')
@@ -19,9 +22,13 @@ def can_view(self, user):
1922

2023

2124
class ResponseManager(models.Manager):
25+
# def all(self, *args, **kwargs):
26+
# return super(ResponseManager, self).all(*args, **kwargs)\
27+
# .select_related('question', 'user')
28+
2229
def can_view(self, user):
2330
qs = super(ResponseManager, self).get_query_set()\
24-
.select_related('question', 'user')
31+
.select_related('question', 'user')
2532

2633
if user.is_staff or user.is_superuser:
2734
return qs.all()

knowledge/models.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ def internal(self, save=True):
140140

141141
class Question(KnowledgeBase):
142142
is_question = True
143+
_requesting_user = None
143144

144145
title = models.CharField(max_length=255,
145146
verbose_name=_('Question'),
@@ -193,8 +194,9 @@ def lock(self, save=True):
193194
###################
194195

195196
def get_responses(self, user=None):
197+
user = user or self._requesting_user
196198
if user:
197-
return Response.objects.can_view(user).filter(question=self)
199+
return [r for r in self.responses.all() if r.can_view(user)]
198200
else:
199201
return self.responses.all()
200202

knowledge/templates/django_knowledge/index.html

+2-5
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,8 @@
99
<div class="dk-widget">
1010
<h3>{% blocktrans with count=questions|length %}Top {{ count }} Questions{% endblocktrans %}</h3>
1111
<hr />
12-
<ol class="question-list">
13-
{% for question in questions %}
14-
<li><a href="{{ question.get_absolute_url }}">{{ question.title }}</a> <small class="quiet">&nbsp;by {{ question.get_name }}</small></li>
15-
{% endfor %}
16-
</ol>
12+
13+
{% include 'django_knowledge/question_list.html' %}
1714
</div>
1815

1916
{% endblock knowledge_widgets %}

knowledge/templates/django_knowledge/list.html

+3-5
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,9 @@
1212
{# dunno how to do translation on this nasty block... #}
1313
<h3>Showing {{ counter }} results{% if search %} for <em>{{ search }}</em>{% endif %}{% if category %} in <em>{{ category.title }}</em> category{% endif %}:</h3>
1414
<hr />
15-
<ol class="question-list">
16-
{% for question in questions.object_list %}
17-
<li><a href="{{ question.get_absolute_url }}">{{ question.title }}</a> <small class="quiet">&nbsp;by {{ question.get_name }}</small></li>
18-
{% endfor %}
19-
</ol>
15+
16+
{% include 'django_knowledge/question_list.html' with questions=questions.object_list %}
17+
2018

2119
{% if not questions.paginator.count %}
2220
<p class="center"><em>{% trans "No results found." %}</em></p>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{% load i18n %}
2+
3+
<ol class="question-list">
4+
{% for question in questions %}
5+
<li><a href="{{ question.get_absolute_url }}">{{ question.title }}</a>&nbsp; {% if not question.get_responses %}<span class="dk-label dk-label-important">{% trans "no responses" %}</span>{% else %}<span class="dk-label">{{ question.get_responses|length }} responses</span>{% endif %}&nbsp; {% if question.accepted %}<span class="dk-label dk-label-warning">{% trans "accepted" %}</span>&nbsp;{% endif %} <small class="quiet">by {{ question.get_name }}</small></li>
6+
{% endfor %}
7+
</ol>

knowledge/views.py

+24-9
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import settings
2+
13
from django.http import Http404
24
from django.shortcuts import render, redirect, get_object_or_404
35
from django.core.urlresolvers import reverse, NoReverseMatch
@@ -27,13 +29,16 @@ def get_my_questions(request):
2729
return None
2830
else:
2931
return Question.objects.can_view(request.user)\
30-
.filter(user=request.user)
32+
.filter(user=request.user)
3133

3234

3335
def knowledge_index(request,
3436
template='django_knowledge/index.html'):
3537

36-
questions = Question.objects.can_view(request.user)[0:20]
38+
questions = Question.objects.can_view(request.user)\
39+
.prefetch_related('responses__question')[0:20]
40+
# this is for get_responses()
41+
[setattr(q, '_requesting_user', request.user) for q in questions]
3742

3843
return render(request, template, {
3944
'request': request,
@@ -49,7 +54,8 @@ def knowledge_list(request,
4954
Form=QuestionForm):
5055

5156
search = request.GET.get('title', None)
52-
questions = Question.objects.can_view(request.user)
57+
questions = Question.objects.can_view(request.user)\
58+
.prefetch_related('responses__question')
5359

5460
if search:
5561
questions = questions.filter(
@@ -61,8 +67,11 @@ def knowledge_list(request,
6167
category = get_object_or_404(Category, slug=category_slug)
6268
questions = questions.filter(categories=category)
6369

64-
paginator, questions = paginate(questions, 50,
65-
request.GET.get('page', '1'))
70+
paginator, questions = paginate(questions,
71+
50,
72+
request.GET.get('page', '1'))
73+
# this is for get_responses()
74+
[setattr(q, '_requesting_user', request.user) for q in questions]
6675

6776
return render(request, template, {
6877
'request': request,
@@ -80,10 +89,16 @@ def knowledge_thread(request,
8089
slug=None,
8190
template='django_knowledge/thread.html',
8291
Form=ResponseForm):
83-
84-
question = get_object_or_404(
85-
Question.objects.can_view(request.user),
86-
id=question_id)
92+
93+
try:
94+
question = Question.objects.can_view(request.user)\
95+
.get(id=question_id)
96+
except Question.DoesNotExist:
97+
if Question.objects.filter(id=question_id).exists() and \
98+
hasattr(settings, 'LOGIN_REDIRECT_URL'):
99+
return redirect(settings.LOGIN_REDIRECT_URL)
100+
else:
101+
raise Http404
87102

88103
responses = question.get_responses(request.user)
89104

setup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
author = 'Bryan Helmig',
1313
author_email = '[email protected]',
1414
url = 'http://github.com/zapier/django-knowledge',
15-
install_requires=['Markdown>=2.1.1',],
15+
install_requires=['Markdown>=2.1.1','Django>=1.4'],
1616
packages=['knowledge'],
1717
package_data={'knowledge': [
1818
'migrations/*.py',

tests/settings.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,6 @@
5252

5353
TEMPLATE_DIRS = (
5454
os.path.join(DIRNAME, 'templates').replace('\\','/')
55-
)
55+
)
56+
57+
LOGIN_REDIRECT_URL = '/admin/'

0 commit comments

Comments
 (0)