diff options
author | Evgeny Fadeev <evgeny.fadeev@gmail.com> | 2012-07-18 04:00:15 -0400 |
---|---|---|
committer | Evgeny Fadeev <evgeny.fadeev@gmail.com> | 2012-07-18 04:00:15 -0400 |
commit | 2cad0b5d765811aa6001b8dd37a8d66235a278cf (patch) | |
tree | 12ab48cf80784876a3c63184f807ff5a9161c29b | |
parent | 40037871f57ec0fe81c543dbad587d8c370e5a94 (diff) | |
download | askbot-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.py | 11 | ||||
-rw-r--r-- | askbot/doc/source/changelog.rst | 1 | ||||
-rw-r--r-- | askbot/exceptions.py | 5 | ||||
-rw-r--r-- | askbot/models/__init__.py | 11 | ||||
-rw-r--r-- | askbot/models/question.py | 9 | ||||
-rw-r--r-- | askbot/skins/default/templates/question/content.html | 12 | ||||
-rw-r--r-- | askbot/tests/badge_tests.py | 6 | ||||
-rw-r--r-- | askbot/views/readers.py | 16 | ||||
-rw-r--r-- | askbot/views/writers.py | 5 |
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: |