# HG changeset patch # User neko259 # Date 2014-07-05 17:22:19 # Node ID 447bb8d7c8b72483942640c6055271e6127b78c0 # Parent d56cc46f416dc8658069c11dfe7131b3fe67bd42 Divided settings manager into base settings manager class and session-based settings manager. This allowes to add other backends to the settings manager diff --git a/boards/abstracts/settingsmanager.py b/boards/abstracts/settingsmanager.py --- a/boards/abstracts/settingsmanager.py +++ b/boards/abstracts/settingsmanager.py @@ -15,10 +15,22 @@ SETTING_PERMISSIONS = 'permissions' DEFAULT_THEME = 'md' -class SettingsManager: +def get_settings_manager(request): + """ + Get settings manager based on the request object. Currently only + session-based manager is supported. In the future, cookie-based or + database-based managers could be implemented. + """ + return SessionSettingsManager(request.session) - def __init__(self, session): - self.session = session + +class SettingsManager: + """ + Base settings manager class. get_setting and set_setting methods should + be overriden. + """ + def __init__(self): + pass def get_theme(self): theme = self.get_setting(SETTING_THEME) @@ -39,13 +51,10 @@ class SettingsManager: return False def get_setting(self, setting): - if setting in self.session: - return self.session[setting] - else: - return None + pass def set_setting(self, setting, value): - self.session[setting] = value + pass def add_permission(self, permission): permissions = self.get_setting(SETTING_PERMISSIONS) @@ -112,3 +121,23 @@ class SettingsManager: if tag.name in tags: tags.remove(tag.name) self.set_setting(SETTING_HIDDEN_TAGS, tags) + + +class SessionSettingsManager(SettingsManager): + """ + Session-based settings manager. All settings are saved to the user's + session. + """ + def __init__(self, session): + SettingsManager.__init__(self) + self.session = session + + def get_setting(self, setting): + if setting in self.session: + return self.session[setting] + else: + return None + + def set_setting(self, setting, value): + self.session[setting] = value + diff --git a/boards/context_processors.py b/boards/context_processors.py --- a/boards/context_processors.py +++ b/boards/context_processors.py @@ -1,5 +1,5 @@ -from boards.abstracts.settingsmanager import SettingsManager, \ - PERMISSION_MODERATE +from boards.abstracts.settingsmanager import PERMISSION_MODERATE, \ + get_settings_manager __author__ = 'neko259' @@ -21,7 +21,7 @@ def user_and_ui_processor(request): context[CONTEXT_PPD] = float(Post.objects.get_posts_per_day()) - settings_manager = SettingsManager(request.session) + settings_manager = get_settings_manager(request) context[CONTEXT_TAGS] = settings_manager.get_fav_tags() theme = settings_manager.get_theme() context[CONTEXT_THEME] = theme diff --git a/boards/tests.py b/boards/tests.py --- a/boards/tests.py +++ b/boards/tests.py @@ -6,6 +6,7 @@ from django.core.paginator import Pagina from django.test import TestCase from django.test.client import Client from django.core.urlresolvers import reverse, NoReverseMatch +from boards.abstracts.settingsmanager import get_settings_manager from boards.models import Post, Tag, Thread from boards import urls @@ -233,10 +234,10 @@ class FormTest(TestCase): class ViewTest(TestCase): def test_all_views(self): - ''' + """ Try opening all views defined in ulrs.py that don't need additional parameters - ''' + """ client = Client() for url in urls.urlpatterns: @@ -248,7 +249,7 @@ class ViewTest(TestCase): response = client.get(reverse(view_name)) self.assertEqual(HTTP_CODE_OK, response.status_code, - '%s view not opened' % view_name) + '%s view not opened' % view_name) except NoReverseMatch: # This view just needs additional arguments pass @@ -257,3 +258,18 @@ class ViewTest(TestCase): except AttributeError: # This is normal, some views do not have names pass + + +class AbstractTest(TestCase): + def test_settings_manager(self): + request = MockRequest() + settings_manager = get_settings_manager(request) + + settings_manager.set_setting('test_setting', 'test_value') + self.assertEqual('test_value', settings_manager.get_setting( + 'test_setting'), u'Setting update failed.') + + +class MockRequest: + def __init__(self): + self.session = dict() \ No newline at end of file diff --git a/boards/views/all_threads.py b/boards/views/all_threads.py --- a/boards/views/all_threads.py +++ b/boards/views/all_threads.py @@ -5,7 +5,7 @@ from django.shortcuts import render, red from boards import utils, settings from boards.abstracts.paginator import get_paginator -from boards.abstracts.settingsmanager import SettingsManager +from boards.abstracts.settingsmanager import get_settings_manager from boards.forms import ThreadForm, PlainErrorList from boards.models import Post, Thread, Ban, Tag from boards.views.banned import BannedView @@ -39,7 +39,7 @@ class AllThreadsView(PostMixin, BaseBoar if not form: form = ThreadForm(error_class=PlainErrorList) - self.settings_manager = SettingsManager(request.session) + self.settings_manager = get_settings_manager(request) paginator = get_paginator(self.get_threads(), settings.THREADS_PER_PAGE) paginator.current_page = int(page) diff --git a/boards/views/ban.py b/boards/views/ban.py --- a/boards/views/ban.py +++ b/boards/views/ban.py @@ -1,8 +1,8 @@ from django.db import transaction from django.shortcuts import get_object_or_404 -from boards.abstracts.settingsmanager import SettingsManager, \ - PERMISSION_MODERATE +from boards.abstracts.settingsmanager import PERMISSION_MODERATE, \ + get_settings_manager from boards.views.base import BaseBoardView from boards.models import Post, Ban from boards.views.mixins import RedirectNextMixin @@ -14,7 +14,7 @@ class BanUserView(BaseBoardView, Redirec def get(self, request, post_id): post = get_object_or_404(Post, id=post_id) - settings_manager = SettingsManager(request.session) + settings_manager = get_settings_manager(request) if settings_manager.has_permission(PERMISSION_MODERATE): # TODO Show confirmation page before ban diff --git a/boards/views/delete_post.py b/boards/views/delete_post.py --- a/boards/views/delete_post.py +++ b/boards/views/delete_post.py @@ -1,8 +1,8 @@ from django.shortcuts import redirect, get_object_or_404 from django.db import transaction -from boards.abstracts.settingsmanager import SettingsManager, \ - PERMISSION_MODERATE +from boards.abstracts.settingsmanager import PERMISSION_MODERATE,\ + get_settings_manager from boards.views.base import BaseBoardView from boards.views.mixins import RedirectNextMixin from boards.models import Post @@ -16,7 +16,7 @@ class DeletePostView(BaseBoardView, Redi opening_post = post.is_opening() - settings_manager = SettingsManager(request.session) + settings_manager = get_settings_manager(request) if settings_manager.has_permission(PERMISSION_MODERATE): # TODO Show confirmation page before deletion Post.objects.delete_post(post) diff --git a/boards/views/login.py b/boards/views/login.py --- a/boards/views/login.py +++ b/boards/views/login.py @@ -1,7 +1,7 @@ from django.shortcuts import render, redirect -from boards.abstracts.settingsmanager import SettingsManager, \ - PERMISSION_MODERATE +from boards.abstracts.settingsmanager import PERMISSION_MODERATE, \ + get_settings_manager from boards.forms import LoginForm, PlainErrorList from boards.views.base import BaseBoardView, CONTEXT_FORM @@ -26,7 +26,7 @@ class LoginView(BaseBoardView): form.session = request.session if form.is_valid(): - settings_manager = SettingsManager(request.session) + settings_manager = get_settings_manager(request) settings_manager.add_permission(PERMISSION_MODERATE) return redirect('index') else: diff --git a/boards/views/logout.py b/boards/views/logout.py --- a/boards/views/logout.py +++ b/boards/views/logout.py @@ -1,7 +1,7 @@ from django.shortcuts import render -from boards.abstracts.settingsmanager import SettingsManager, \ - PERMISSION_MODERATE +from boards.abstracts.settingsmanager import PERMISSION_MODERATE,\ + get_settings_manager from boards.forms import LoginForm from boards.views.base import BaseBoardView, CONTEXT_FORM @@ -12,7 +12,7 @@ from boards.views.base import BaseBoardV class LogoutView(BaseBoardView): def get(self, request, form=None): - settings_manager = SettingsManager(request.session) + settings_manager = get_settings_manager(request) settings_manager.del_permission(PERMISSION_MODERATE) context = self.get_context_data(request=request) diff --git a/boards/views/post_admin.py b/boards/views/post_admin.py --- a/boards/views/post_admin.py +++ b/boards/views/post_admin.py @@ -1,7 +1,7 @@ from django.shortcuts import render, get_object_or_404, redirect -from boards.abstracts.settingsmanager import SettingsManager, \ - PERMISSION_MODERATE +from boards.abstracts.settingsmanager import PERMISSION_MODERATE,\ + get_settings_manager from boards.views.base import BaseBoardView from boards.views.mixins import DispatcherMixin from boards.models.post import Post @@ -12,7 +12,7 @@ from boards.forms import AddTagForm, Pla class PostAdminView(BaseBoardView, DispatcherMixin): def get(self, request, post_id, form=None): - settings_manager = SettingsManager(request.session) + settings_manager = get_settings_manager(request) if not settings_manager.has_permission(PERMISSION_MODERATE): redirect('index') @@ -33,7 +33,7 @@ class PostAdminView(BaseBoardView, Dispa return render(request, 'boards/post_admin.html', context) def post(self, request, post_id): - settings_manager = SettingsManager(request.session) + settings_manager = get_settings_manager(request) if not settings_manager.has_permission(PERMISSION_MODERATE): redirect('index') diff --git a/boards/views/settings.py b/boards/views/settings.py --- a/boards/views/settings.py +++ b/boards/views/settings.py @@ -1,7 +1,7 @@ from django.db import transaction from django.shortcuts import render, redirect -from boards.abstracts.settingsmanager import SettingsManager +from boards.abstracts.settingsmanager import get_settings_manager from boards.views.base import BaseBoardView, CONTEXT_FORM from boards.forms import SettingsForm, PlainErrorList @@ -10,7 +10,7 @@ class SettingsView(BaseBoardView): def get(self, request): context = self.get_context_data(request=request) - settings_manager = SettingsManager(request.session) + settings_manager = get_settings_manager(request) selected_theme = settings_manager.get_theme() @@ -22,7 +22,7 @@ class SettingsView(BaseBoardView): return render(request, 'boards/settings.html', context) def post(self, request): - settings_manager = SettingsManager(request.session) + settings_manager = get_settings_manager(request) with transaction.atomic(): form = SettingsForm(request.POST, error_class=PlainErrorList) diff --git a/boards/views/tag_threads.py b/boards/views/tag_threads.py --- a/boards/views/tag_threads.py +++ b/boards/views/tag_threads.py @@ -1,11 +1,12 @@ from django.shortcuts import get_object_or_404 -from boards import utils -from boards.abstracts.settingsmanager import SettingsManager -from boards.models import Tag, Post + +from boards.abstracts.settingsmanager import get_settings_manager +from boards.models import Tag from boards.views.all_threads import AllThreadsView, DEFAULT_PAGE from boards.views.mixins import DispatcherMixin, RedirectNextMixin from boards.forms import ThreadForm, PlainErrorList + __author__ = 'neko259' @@ -21,7 +22,7 @@ class TagView(AllThreadsView, Dispatcher def get_context_data(self, **kwargs): context = super(TagView, self).get_context_data(**kwargs) - settings_manager = SettingsManager(kwargs['request'].session) + settings_manager = get_settings_manager(kwargs['request']) tag = get_object_or_404(Tag, name=self.tag_name) context['tag'] = tag @@ -56,7 +57,7 @@ class TagView(AllThreadsView, Dispatcher def subscribe(self, request): tag = get_object_or_404(Tag, name=self.tag_name) - settings_manager = SettingsManager(request.session) + settings_manager = get_settings_manager(request) settings_manager.add_fav_tag(tag) return self.redirect_to_next(request) @@ -64,7 +65,7 @@ class TagView(AllThreadsView, Dispatcher def unsubscribe(self, request): tag = get_object_or_404(Tag, name=self.tag_name) - settings_manager = SettingsManager(request.session) + settings_manager = get_settings_manager(request) settings_manager.del_fav_tag(tag) return self.redirect_to_next(request) @@ -77,7 +78,7 @@ class TagView(AllThreadsView, Dispatcher tag = get_object_or_404(Tag, name=self.tag_name) - settings_manager = SettingsManager(request.session) + settings_manager = get_settings_manager(request) settings_manager.add_hidden_tag(tag) def unhide(self, request): @@ -87,5 +88,5 @@ class TagView(AllThreadsView, Dispatcher tag = get_object_or_404(Tag, name=self.tag_name) - settings_manager = SettingsManager(request.session) + settings_manager = get_settings_manager(request) settings_manager.del_hidden_tag(tag)