diff options
author | Vlad Bokov <razum2um@mail.ru> | 2011-11-05 09:23:32 +0700 |
---|---|---|
committer | Vlad Bokov <razum2um@mail.ru> | 2011-11-05 09:23:32 +0700 |
commit | a604709a11c39e99f70fe9c3ca6f37ef5173668d (patch) | |
tree | aae856bd3bd891f26d8fa19b384dfc91e5092351 | |
parent | 114867ecbc9b4120fc40293e9654c7092829c033 (diff) | |
download | askbot-a604709a11c39e99f70fe9c3ca6f37ef5173668d.tar.gz askbot-a604709a11c39e99f70fe9c3ca6f37ef5173668d.tar.bz2 askbot-a604709a11c39e99f70fe9c3ca6f37ef5173668d.zip |
Feature #111: closed forum mode + tests
-rw-r--r-- | askbot/conf/login_providers.py | 11 | ||||
-rw-r--r-- | askbot/middleware/anon_user.py | 5 | ||||
-rw-r--r-- | askbot/middleware/forum_mode.py | 18 | ||||
-rw-r--r-- | askbot/setup_templates/settings.py | 2 | ||||
-rw-r--r-- | askbot/tests/permission_assertion_tests.py | 32 |
5 files changed, 67 insertions, 1 deletions
diff --git a/askbot/conf/login_providers.py b/askbot/conf/login_providers.py index 0cc20a9a..da832a1d 100644 --- a/askbot/conf/login_providers.py +++ b/askbot/conf/login_providers.py @@ -64,6 +64,17 @@ settings.register( ) ) +settings.register( + livesettings.BooleanValue( + LOGIN_PROVIDERS, + 'ASKBOT_CLOSED_FORUM_MODE', + default = django_settings.ASKBOT_CLOSED_FORUM_MODE, + description=_('Support mode where only registered users can access the forum'), + help_text=_('to activate this permanently use ASKBOT_CLOSED_FORUM_MODE ' + 'in your settings.py') + ) +) + providers = ( 'local', 'AOL', diff --git a/askbot/middleware/anon_user.py b/askbot/middleware/anon_user.py index adaf6fd2..01d149ee 100644 --- a/askbot/middleware/anon_user.py +++ b/askbot/middleware/anon_user.py @@ -45,6 +45,8 @@ class ConnectToSessionMessagesMiddleware(object): if request.user.is_anonymous(): #1) Attach the ability to receive messages #plug on deepcopy which may be called by django db "driver" + #from copy import deepcopy + #request.user = deepcopy(request.user) request.user.__deepcopy__ = dummy_deepcopy #here request is linked to anon user request.user.message_set = AnonymousMessageManager(request) @@ -63,7 +65,8 @@ class ConnectToSessionMessagesMiddleware(object): """Adds the ``'askbot_visitor'``key to cookie if user ever authenticates so that the anonymous user message won't be shown after the user logs out""" - if request.user.is_authenticated() and \ + if hasattr(request, 'user') and \ + request.user.is_authenticated() and \ 'askbot_visitor' not in request.COOKIES : #import datetime #max_age = 365*24*60*60 diff --git a/askbot/middleware/forum_mode.py b/askbot/middleware/forum_mode.py new file mode 100644 index 00000000..ff99be49 --- /dev/null +++ b/askbot/middleware/forum_mode.py @@ -0,0 +1,18 @@ +from django.http import HttpResponseRedirect +from django.utils.translation import ugettext as _ +from django.conf import settings +from django.core.urlresolvers import resolve + +from askbot.conf import settings as askbot_settings + +class ForumModeMiddleware(object): + + def process_request(self, request): + if (askbot_settings.ASKBOT_CLOSED_FORUM_MODE + and request.user.is_anonymous() + and not (request.path == settings.LOGIN_URL or + resolve(request.path).url_name in ['custom_css', 'custom_js', 'askbot_jsi18n', 'askbot_media', 'sitemap'])): + request.user.message_set.create(_('Please log in to use %s') % askbot_settings.APP_SHORT_NAME) + return HttpResponseRedirect(settings.LOGIN_URL) + else: + return None diff --git a/askbot/setup_templates/settings.py b/askbot/setup_templates/settings.py index a97402aa..20598463 100644 --- a/askbot/setup_templates/settings.py +++ b/askbot/setup_templates/settings.py @@ -102,6 +102,7 @@ MIDDLEWARE_CLASSES = ( #below is askbot stuff for this tuple 'askbot.middleware.anon_user.ConnectToSessionMessagesMiddleware', + 'askbot.middleware.forum_mode.ForumModeMiddleware', 'askbot.middleware.pagesize.QuestionsPageSizeMiddleware', 'askbot.middleware.cancel.CancelActionMiddleware', 'django.middleware.transaction.TransactionMiddleware', @@ -206,6 +207,7 @@ LOGIN_URL = '/%s%s%s' % (ASKBOT_URL,_('account/'),_('signin/')) ASKBOT_UPLOADED_FILES_URL = '%s%s' % (ASKBOT_URL, 'upfiles/') ALLOW_UNICODE_SLUGS = False ASKBOT_USE_STACKEXCHANGE_URLS = False #mimic url scheme of stackexchange +ASKBOT_CLOSED_FORUM_MODE = False #Celery Settings BROKER_BACKEND = "djkombu.transport.DatabaseTransport" diff --git a/askbot/tests/permission_assertion_tests.py b/askbot/tests/permission_assertion_tests.py index fc1fbcb7..56b85f9b 100644 --- a/askbot/tests/permission_assertion_tests.py +++ b/askbot/tests/permission_assertion_tests.py @@ -1,4 +1,7 @@ import datetime +from django.test.client import Client +from django.core.urlresolvers import reverse +from django.conf import settings from django.test import TestCase from django.core import exceptions from askbot.tests import utils @@ -1573,3 +1576,32 @@ class UploadPermissionAssertionTests(PermissionAssertionTestCase): self.user.assert_can_upload_file() except exceptions.PermissionDenied: self.fail('high rep user must be able to upload') + +class ClosedForumTests(utils.AskbotTestCase): + def setUp(self): + self.password = '123' + self.create_user() + self.create_user(username = 'other_user') + self.other_user.set_password(self.password) + self.other_user.save() + self.question = self.post_question() + self.test_url = reverse('question', kwargs={'id':self.question.id}) + self.redirect_to = settings.LOGIN_URL + askbot_settings.ASKBOT_CLOSED_FORUM_MODE = True + + def test_anonymous_access(self): + client = Client() + response = client.get(self.test_url) + self.assertEquals(response.status_code, 302) + self.assertTrue(self.redirect_to in response['Location']) + + def test_authentificated_access(self): + client = Client() + client.login(username=self.other_user.username, password=self.password) + response = client.get(self.test_url) + self.assertEquals(response.status_code, 302) + self.assertTrue(self.redirect_to not in response['Location']) + self.assertTrue(self.test_url in response['Location']) + + def tearDown(self): + askbot_settings.ASKBOT_CLOSED_FORUM_MODE = False |