summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvgeny Fadeev <evgeny.fadeev@gmail.com>2012-07-18 04:00:15 -0400
committerEvgeny Fadeev <evgeny.fadeev@gmail.com>2012-07-18 04:00:15 -0400
commit2cad0b5d765811aa6001b8dd37a8d66235a278cf (patch)
tree12ab48cf80784876a3c63184f807ff5a9161c29b
parent40037871f57ec0fe81c543dbad587d8c370e5a94 (diff)
downloadaskbot-2cad0b5d765811aa6001b8dd37a8d66235a278cf.tar.gz
askbot-2cad0b5d765811aa6001b8dd37a8d66235a278cf.tar.bz2
askbot-2cad0b5d765811aa6001b8dd37a8d66235a278cf.zip
added option to limit one answer per question per person
-rw-r--r--askbot/conf/forum_data_rules.py11
-rw-r--r--askbot/doc/source/changelog.rst1
-rw-r--r--askbot/exceptions.py5
-rw-r--r--askbot/models/__init__.py11
-rw-r--r--askbot/models/question.py9
-rw-r--r--askbot/skins/default/templates/question/content.html12
-rw-r--r--askbot/tests/badge_tests.py6
-rw-r--r--askbot/views/readers.py16
-rw-r--r--askbot/views/writers.py5
9 files changed, 68 insertions, 8 deletions
diff --git a/askbot/conf/forum_data_rules.py b/askbot/conf/forum_data_rules.py
index a26aa4b3..b7077a15 100644
--- a/askbot/conf/forum_data_rules.py
+++ b/askbot/conf/forum_data_rules.py
@@ -122,6 +122,17 @@ settings.register(
settings.register(
livesettings.BooleanValue(
FORUM_DATA_RULES,
+ 'LIMIT_ONE_ANSWER_PER_USER',
+ default = True,
+ description = _(
+ 'Limit one answer per question per user'
+ )
+ )
+)
+
+settings.register(
+ livesettings.BooleanValue(
+ FORUM_DATA_RULES,
'TAGS_ARE_REQUIRED',
description = _('Are tags required?'),
default = False,
diff --git a/askbot/doc/source/changelog.rst b/askbot/doc/source/changelog.rst
index 00918e76..ea52b8df 100644
--- a/askbot/doc/source/changelog.rst
+++ b/askbot/doc/source/changelog.rst
@@ -3,6 +3,7 @@ Changes in Askbot
Development version
-------------------
+* Optionally allow limiting one answer per question per person (Evgeny)
* Added management command `build_livesettings_cache` (Adolfo)
* Welcome email for the case when replying by email is enabled (Evgeny)
* Detection of email signature based on the response to the welcome email (Evgeny)
diff --git a/askbot/exceptions.py b/askbot/exceptions.py
index d2d5ddf0..12802e7e 100644
--- a/askbot/exceptions.py
+++ b/askbot/exceptions.py
@@ -19,6 +19,11 @@ class InsufficientReputation(exceptions.PermissionDenied):
"""
pass
+class AnswerAlreadyGiven(exceptions.PermissionDenied):
+ """Raised when user attempts to post a second answer
+ to the same question"""
+ pass
+
class DuplicateCommand(exceptions.PermissionDenied):
"""exception class to indicate that something
that can happen only once was attempted for the second time
diff --git a/askbot/models/__init__.py b/askbot/models/__init__.py
index ed0d876a..1c884ed6 100644
--- a/askbot/models/__init__.py
+++ b/askbot/models/__init__.py
@@ -551,9 +551,16 @@ def user_assert_can_post_question(self):
)
-def user_assert_can_post_answer(self):
+def user_assert_can_post_answer(self, thread = None):
"""same as user_can_post_question
"""
+ limit_answers = askbot_settings.LIMIT_ONE_ANSWER_PER_USER
+ if limit_answers and thread.has_answer_by_user(self):
+ message = _(
+ 'Sorry, you already gave an answer, please edit it instead.'
+ )
+ raise askbot_exceptions.AnswerAlreadyGiven(message)
+
self.assert_can_post_question()
@@ -1718,7 +1725,7 @@ def user_post_answer(
assert(error_message is not None)
raise django_exceptions.PermissionDenied(error_message)
- self.assert_can_post_answer()
+ self.assert_can_post_answer(thread = question.thread)
if getattr(question, 'post_type', '') != 'question':
raise TypeError('question argument must be provided')
diff --git a/askbot/models/question.py b/askbot/models/question.py
index 1729b531..3453ff7c 100644
--- a/askbot/models/question.py
+++ b/askbot/models/question.py
@@ -498,6 +498,14 @@ class Thread(models.Model):
output += answer.format_for_email_as_subthread()
return output
+ def get_answers_by_user(self, user):
+ """regardless - deleted or not"""
+ return self.posts.filter(post_type = 'answer', author = user)
+
+ def has_answer_by_user(self, user):
+ #use len to cache the queryset
+ return len(self.get_answers_by_user(user)) > 0
+
def tagname_meta_generator(self):
return u','.join([unicode(tag) for tag in self.get_tag_names()])
@@ -920,6 +928,7 @@ class AnonymousQuestion(AnonymousContent):
def publish(self,user):
added_at = datetime.datetime.now()
+ #todo: wrong - use User.post_question() instead
Thread.objects.create_new(
title = self.title,
added_at = added_at,
diff --git a/askbot/skins/default/templates/question/content.html b/askbot/skins/default/templates/question/content.html
index f01c68e0..66b3014b 100644
--- a/askbot/skins/default/templates/question/content.html
+++ b/askbot/skins/default/templates/question/content.html
@@ -29,8 +29,16 @@
{% endif %}
{# ==== START: question/new_answer_form.html ==== #}
-{% include "question/new_answer_form.html" %}
-{# ==== END: question/new_answer_form.html ==== #}
+{# buttons below cannot be cached yet #}
+{% if user_already_gave_answer %}
+ <a
+ class="submit"
+ href="{% url "edit_answer" previous_answer.id %}"
+ >{% trans %}Edit Your Previous Answer{% endtrans %}</a>
+ <span>{% trans %}(only one answer per question is allowed){% endtrans %}</span>
+{% else %}
+ {% include "question/new_answer_form.html" %}
+{% endif %}
{% if question.closed == False and request.user == question.author %}{# this is outside the form on purpose #}
<input
type="button"
diff --git a/askbot/tests/badge_tests.py b/askbot/tests/badge_tests.py
index dbb37dde..b66eadcc 100644
--- a/askbot/tests/badge_tests.py
+++ b/askbot/tests/badge_tests.py
@@ -68,7 +68,8 @@ class BadgeTests(AskbotTestCase):
self.assert_have_badge(badge_key, recipient = self.u2, expected_count = 1)
#post another question and check that there are no new badges
- answer2 = self.post_answer(user = self.u2, question = question)
+ question2 = self.post_question(user = self.u1)
+ answer2 = self.post_answer(user = self.u2, question = question2)
answer2.score = min_score - 1
answer2.save()
self.u1.upvote(answer2)
@@ -269,7 +270,8 @@ class BadgeTests(AskbotTestCase):
answer = self.post_answer(user = self.u2, question = question)
self.u1.accept_best_answer(answer)
self.assert_have_badge('scholar', recipient = self.u1)
- answer2 = self.post_answer(user = self.u2, question = question)
+ question2 = self.post_question(user = self.u1)
+ answer2 = self.post_answer(user = self.u2, question = question2)
self.u1.accept_best_answer(answer2)
self.assert_have_badge(
'scholar',
diff --git a/askbot/views/readers.py b/askbot/views/readers.py
index c73b0c35..5f4d9ee4 100644
--- a/askbot/views/readers.py
+++ b/askbot/views/readers.py
@@ -455,7 +455,7 @@ def question(request, id):#refactor - long subroutine. display question body, an
user_post_id_list = [
id for id in post_to_author if post_to_author[id] == request.user.id
]
-
+
#resolve page number and comment number for permalinks
show_comment_position = None
if show_comment:
@@ -520,7 +520,7 @@ def question(request, id):#refactor - long subroutine. display question body, an
is_cacheable = False
elif show_comment_position > askbot_settings.MAX_COMMENTS_TO_SHOW:
is_cacheable = False
-
+
answer_form = AnswerForm(
initial = {
'wiki': question_post.wiki and askbot_settings.WIKI_ON,
@@ -532,6 +532,16 @@ def question(request, id):#refactor - long subroutine. display question body, an
request.user.is_authenticated() and request.user.can_post_comment()
)
+ user_already_gave_answer = False
+ previous_answer = None
+ if request.user.is_authenticated():
+ if askbot_settings.LIMIT_ONE_ANSWER_PER_USER:
+ for answer in answers:
+ if answer.author == request.user:
+ user_already_gave_answer = True
+ previous_answer = answer
+ break
+
data = {
'is_cacheable': False,#is_cacheable, #temporary, until invalidation fix
'long_time': const.LONG_TIME,#"forever" caching
@@ -545,6 +555,8 @@ def question(request, id):#refactor - long subroutine. display question body, an
'user_votes': user_votes,
'user_post_id_list': user_post_id_list,
'user_can_post_comment': user_can_post_comment,#in general
+ 'user_already_gave_answer': user_already_gave_answer,
+ 'previous_answer': previous_answer,
'tab_id' : answer_sort_method,
'favorited' : favorited,
'similar_threads' : thread.get_similar_threads(),
diff --git a/askbot/views/writers.py b/askbot/views/writers.py
index 232dbaea..9a2de128 100644
--- a/askbot/views/writers.py
+++ b/askbot/views/writers.py
@@ -24,6 +24,7 @@ from django.core import exceptions
from django.conf import settings
from django.views.decorators import csrf
+from askbot import exceptions as askbot_exceptions
from askbot import forms
from askbot import models
from askbot.skins.loaders import render_into_skin
@@ -499,6 +500,10 @@ def answer(request, id):#process a new answer
timestamp = update_time,
)
return HttpResponseRedirect(answer.get_absolute_url())
+ except askbot_exceptions.AnswerAlreadyGiven, e:
+ request.user.message_set.create(message = unicode(e))
+ answer = question.thread.get_answers_by_user(request.user)[0]
+ return HttpResponseRedirect(answer.get_absolute_url())
except exceptions.PermissionDenied, e:
request.user.message_set.create(message = unicode(e))
else: