summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdolfo Fitoria <adolfo.fitoria@gmail.com>2011-11-08 09:34:27 -0300
committerAdolfo Fitoria <adolfo.fitoria@gmail.com>2011-11-08 09:34:27 -0300
commit78bceb27659471f9efcdc9b313b3195af801cf4f (patch)
tree01d9c5a07e5bc3addfe43131d4a5996727e6ed69
parent329a9ec8d57cc96bdd0de85fa9a98671c45bce9b (diff)
parentab5cd18f5a694f127a7f6fae566ca86c7097fd0b (diff)
downloadaskbot-78bceb27659471f9efcdc9b313b3195af801cf4f.tar.gz
askbot-78bceb27659471f9efcdc9b313b3195af801cf4f.tar.bz2
askbot-78bceb27659471f9efcdc9b313b3195af801cf4f.zip
Merge branch 'new-template' of github.com:ASKBOT/askbot-devel into new-template
-rw-r--r--askbot/conf/spam_and_moderation.py1
-rw-r--r--askbot/conf/vote_rules.py10
-rw-r--r--askbot/doc/source/changelog.rst1
-rw-r--r--askbot/doc/source/contributors.rst1
-rw-r--r--askbot/models/__init__.py15
-rw-r--r--askbot/setup_templates/settings.py1
-rw-r--r--askbot/skins/common/media/js/post.js10
-rw-r--r--askbot/skins/common/templates/question/answer_vote_buttons.html2
-rw-r--r--askbot/tests/db_api_tests.py35
-rw-r--r--askbot/tests/permission_assertion_tests.py38
-rw-r--r--askbot/views/readers.py2
11 files changed, 99 insertions, 17 deletions
diff --git a/askbot/conf/spam_and_moderation.py b/askbot/conf/spam_and_moderation.py
index e841ebf7..23cb9596 100644
--- a/askbot/conf/spam_and_moderation.py
+++ b/askbot/conf/spam_and_moderation.py
@@ -31,4 +31,3 @@ settings.register(
description=_('Akismet key for spam detection')
)
)
-
diff --git a/askbot/conf/vote_rules.py b/askbot/conf/vote_rules.py
index 5d275708..82c9b758 100644
--- a/askbot/conf/vote_rules.py
+++ b/askbot/conf/vote_rules.py
@@ -78,3 +78,13 @@ settings.register(
description=_('Number of flags required to automatically delete posts')
)
)
+
+settings.register(
+ IntegerValue(
+ VOTE_RULES,
+ 'MIN_DAYS_FOR_STAFF_TO_ACCEPT_ANSWER',
+ default=7,
+ description=_('Minimum days to accept an answer, '
+ 'if it has not been accepted by the question poster')
+ )
+)
diff --git a/askbot/doc/source/changelog.rst b/askbot/doc/source/changelog.rst
index b22839e0..0c05deb2 100644
--- a/askbot/doc/source/changelog.rst
+++ b/askbot/doc/source/changelog.rst
@@ -5,6 +5,7 @@ Development version (not yet published)
---------------------------------------
* Show unused vote count (Tomasz Zielinski)
* Categorized live settings (Evgeny)
+* Anonymous caching of the question page (Vlad Bokov)
0.7.26 (Current Version)
------------------------
diff --git a/askbot/doc/source/contributors.rst b/askbot/doc/source/contributors.rst
index ac807193..3e62af26 100644
--- a/askbot/doc/source/contributors.rst
+++ b/askbot/doc/source/contributors.rst
@@ -19,6 +19,7 @@ Programming and documentation
* `Hrishi <https://github.com/stultus>`_
* Andrei Mamoutkine
* `Ramiro Morales <http://rmorales.com.ar/>`_ (with Machinalis)
+* Vladimir Bokov
* `NoahY <https://github.com/NoahY>`_
* `Gael Pasgrimaud <http://www.gawel.org/>`_ (bearstech)
* `Arun SAG <http://zer0c00l.in/>`_
diff --git a/askbot/models/__init__.py b/askbot/models/__init__.py
index e1677d9f..5d1cd95d 100644
--- a/askbot/models/__init__.py
+++ b/askbot/models/__init__.py
@@ -342,9 +342,22 @@ def user_assert_can_unaccept_best_answer(self, answer = None):
low_rep_error_message = low_rep_error_message
)
return # success
+
+ elif self.is_administrator() or self.is_moderator():
+ will_be_able_at = (answer.added_at +
+ datetime.timedelta(days=askbot_settings.MIN_DAYS_FOR_STAFF_TO_ACCEPT_ANSWER))
+
+ if datetime.datetime.now() < will_be_able_at:
+ error_message = _(
+ 'Sorry, you will be able to accept this answer '
+ 'only after %(will_be_able_at)s'
+ ) % {'will_be_able_at': will_be_able_at.strftime('%d/%m/%Y')}
+ else:
+ return
+
else:
error_message = _(
- 'Sorry, only original author of the question '
+ 'Sorry, only moderators or original author of the question '
' - %(username)s - can accept or unaccept the best answer'
) % {'username': answer.get_owner().username}
diff --git a/askbot/setup_templates/settings.py b/askbot/setup_templates/settings.py
index a97402aa..3aead40f 100644
--- a/askbot/setup_templates/settings.py
+++ b/askbot/setup_templates/settings.py
@@ -176,6 +176,7 @@ CACHE_BACKEND = 'locmem://'
#needed for django-keyedcache
CACHE_TIMEOUT = 6000
CACHE_PREFIX = 'askbot' #make this unique
+CACHE_MIDDLEWARE_ANONYMOUS_ONLY = True
#If you use memcache you may want to uncomment the following line to enable memcached based sessions
#SESSION_ENGINE = 'django.contrib.sessions.backends.cache_db'
diff --git a/askbot/skins/common/media/js/post.js b/askbot/skins/common/media/js/post.js
index 82f76bc8..31d42803 100644
--- a/askbot/skins/common/media/js/post.js
+++ b/askbot/skins/common/media/js/post.js
@@ -389,12 +389,10 @@ var Vote = function(){
var bindEvents = function(){
// accept answers
- if(questionAuthorId == currentUserId){
- var acceptedButtons = 'div.'+ voteContainerId +' img[id^='+ imgIdPrefixAccept +']';
- $(acceptedButtons).unbind('click').click(function(event){
- Vote.accept($(event.target));
- });
- }
+ var acceptedButtons = 'div.'+ voteContainerId +' img[id^='+ imgIdPrefixAccept +']';
+ $(acceptedButtons).unbind('click').click(function(event){
+ Vote.accept($(event.target));
+ });
// set favorite question
var favoriteButton = getFavoriteButton();
favoriteButton.unbind('click').click(function(event){
diff --git a/askbot/skins/common/templates/question/answer_vote_buttons.html b/askbot/skins/common/templates/question/answer_vote_buttons.html
index 841fe55a..2744e37d 100644
--- a/askbot/skins/common/templates/question/answer_vote_buttons.html
+++ b/askbot/skins/common/templates/question/answer_vote_buttons.html
@@ -3,7 +3,7 @@
visitor_vote = user_answer_votes[answer.id]
)
}}
-{% if request.user == question.author %}
+{% if request.user == question.author or request.user.is_authenticated() and (request.user.is_moderator() or request.user.is_superuser()) %}
<img id="answer-img-accept-{{ answer.id }}" class="answer-img-accept"
{% if answer.accepted %}
src="{{'/images/vote-accepted-on.png'|media}}"
diff --git a/askbot/tests/db_api_tests.py b/askbot/tests/db_api_tests.py
index 00091934..e1268d9f 100644
--- a/askbot/tests/db_api_tests.py
+++ b/askbot/tests/db_api_tests.py
@@ -4,6 +4,10 @@ functions that happen on behalf of users
e.g. ``some_user.do_something(...)``
"""
from django.core import exceptions
+from django.core.urlresolvers import reverse
+from django.db import connection
+from django.test.client import Client
+from django.conf import settings
from askbot.tests.utils import AskbotTestCase
from askbot import models
from askbot import const
@@ -39,6 +43,37 @@ class DBApiTests(AskbotTestCase):
self.assertTrue(post.deleted_by == None)
self.assertTrue(post.deleted_at == None)
+ def test_anonymous_question_cache(self):
+ question = self.post_question()
+ settings.DEBUG = True # because it's forsed to False
+ url = reverse('question', kwargs={'id': question.id})
+
+ client = Client()
+ client.get(url, follow=True)
+ counter = len(connection.queries)
+ client.get(url, follow=True)
+
+ self.assertTrue(counter > len(connection.queries))
+ self.assertEqual(3, len(connection.queries)) # session-related only
+ settings.DEBUG = False
+
+ def test_authentificated_no_question_cache(self):
+ question = self.post_question()
+ settings.DEBUG = True # because it's forsed to False
+ url = reverse('question', kwargs={'id': question.id})
+
+ password = '123'
+ client = Client()
+ self.other_user.set_password(password)
+ client.login(username=self.other_user.username, password=password)
+
+ client.get(url, follow=True)
+ counter = len(connection.queries)
+ client.get(url, follow=True)
+
+ self.assertEqual(counter, len(connection.queries))
+ settings.DEBUG = False
+
def test_flag_question(self):
self.user.set_status('m')
self.user.flag_post(self.question)
diff --git a/askbot/tests/permission_assertion_tests.py b/askbot/tests/permission_assertion_tests.py
index 83476c79..fc1fbcb7 100644
--- a/askbot/tests/permission_assertion_tests.py
+++ b/askbot/tests/permission_assertion_tests.py
@@ -1368,23 +1368,27 @@ class AcceptBestAnswerPermissionAssertionTests(utils.AskbotTestCase):
self.third_user.reputation = 1000000
self.assert_user_cannot(user = self.third_user)
- def test_moderator_cannot_accept_others_answer(self):
- self.other_post_answer()
- self.create_user(username = 'third_user')
- self.third_user.set_status('m')
- self.assert_user_cannot(user = self.third_user)
-
def test_moderator_cannot_accept_own_answer(self):
self.other_post_answer()
self.other_user.set_status('m')
self.assert_user_cannot(user = self.other_user)
- def test_admin_cannot_accept_others_answer(self):
+ def test_moderator_cannot_accept_others_answer_today(self):
+ self.other_post_answer()
+ self.create_user(username = 'third_user')
+ self.third_user.set_status('m')
+ self.assert_user_cannot(user = self.third_user)
+
+ def test_moderator_can_accept_others_old_answer(self):
self.other_post_answer()
+ self.answer.added_at -= datetime.timedelta(
+ days = askbot_settings.MIN_DAYS_FOR_STAFF_TO_ACCEPT_ANSWER + 1
+ )
+ self.answer.save()
self.create_user(username = 'third_user')
self.third_user.set_admin_status()
self.third_user.save()
- self.assert_user_cannot(user = self.third_user)
+ self.assert_user_can(user = self.third_user)
def test_admin_cannot_accept_own_answer(self):
self.other_post_answer()
@@ -1392,6 +1396,24 @@ class AcceptBestAnswerPermissionAssertionTests(utils.AskbotTestCase):
self.other_user.save()
self.assert_user_cannot(user = self.other_user)
+ def test_admin_cannot_accept_others_answer_today(self):
+ self.other_post_answer()
+ self.create_user(username = 'third_user')
+ self.third_user.set_admin_status()
+ self.third_user.save()
+ self.assert_user_cannot(user = self.third_user)
+
+ def test_admin_can_accept_others_old_answer(self):
+ self.other_post_answer()
+ self.answer.added_at -= datetime.timedelta(
+ days = askbot_settings.MIN_DAYS_FOR_STAFF_TO_ACCEPT_ANSWER + 1
+ )
+ self.answer.save()
+ self.create_user(username = 'third_user')
+ self.third_user.set_admin_status()
+ self.third_user.save()
+ self.assert_user_can(user = self.third_user)
+
class VotePermissionAssertionTests(PermissionAssertionTestCase):
"""Tests permission for voting
"""
diff --git a/askbot/views/readers.py b/askbot/views/readers.py
index 8df07874..4a12fe2c 100644
--- a/askbot/views/readers.py
+++ b/askbot/views/readers.py
@@ -23,6 +23,7 @@ from django.views.decorators import csrf
from django.core.urlresolvers import reverse
from django.core import exceptions as django_exceptions
from django.contrib.humanize.templatetags import humanize
+from django.views.decorators.cache import cache_page
import askbot
from askbot import exceptions
@@ -349,6 +350,7 @@ def tags(request):#view showing a listing of available tags - plain list
return render_into_skin('tags.html', data, request)
@csrf.csrf_protect
+@cache_page(60 * 5)
def question(request, id):#refactor - long subroutine. display question body, answers and comments
"""view that displays body of the question and
all answers to it