summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--askbot/conf/login_providers.py11
-rw-r--r--askbot/middleware/anon_user.py3
-rw-r--r--askbot/middleware/forum_mode.py18
-rw-r--r--askbot/setup_templates/settings.py2
-rw-r--r--askbot/tests/permission_assertion_tests.py32
5 files changed, 65 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..7cd9279d 100644
--- a/askbot/middleware/anon_user.py
+++ b/askbot/middleware/anon_user.py
@@ -63,7 +63,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 ef24a82f..e8adc2ce 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',
@@ -208,6 +209,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_TRANSPORT = "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