From 93ab2fe11d2197b46e41294a29767ae8f24644b8 Mon Sep 17 00:00:00 2001 From: Rizmari Versfeld Date: Fri, 22 May 2015 11:01:20 +0200 Subject: [PATCH 1/2] split views up into SpringboardViews base class and CoreViews --- springboard/tests/test_views.py | 16 ++++---- springboard/views/__init__.py | 0 springboard/views/base.py | 50 +++++++++++++++++++++++++ springboard/{views.py => views/core.py} | 48 ++---------------------- 4 files changed, 61 insertions(+), 53 deletions(-) create mode 100644 springboard/views/__init__.py create mode 100644 springboard/views/base.py rename springboard/{views.py => views/core.py} (54%) diff --git a/springboard/tests/test_views.py b/springboard/tests/test_views.py index 0c2ca62..611b2e6 100644 --- a/springboard/tests/test_views.py +++ b/springboard/tests/test_views.py @@ -1,5 +1,5 @@ from springboard.tests import SpringboardTestCase -from springboard.views import SpringboardViews +from springboard.views.core import CoreViews from springboard.utils import parse_repo_name from pyramid import testing @@ -21,14 +21,14 @@ def tearDown(self): testing.tearDown() def test_default_context(self): - views = SpringboardViews(self.mk_request()) + views = CoreViews(self.mk_request()) context = views.context() self.assertEqual(context['language'], 'eng_GB') self.assertEqual(context['all_categories'].count(), 0) self.assertEqual(context['all_pages'].count(), 0) def test_index_view(self): - views = SpringboardViews(self.mk_request()) + views = CoreViews(self.mk_request()) context = views.index_view() self.assertEqual(set(context.keys()), set(['user', 'language', 'all_categories', @@ -36,7 +36,7 @@ def test_index_view(self): def test_category(self): [category] = self.mk_categories(self.workspace, count=1) - views = SpringboardViews( + views = CoreViews( self.mk_request(matchdict={'uuid': category.uuid})) context = views.category() self.assertEqual(context['category'].uuid, category.uuid) @@ -46,7 +46,7 @@ def test_page(self): [category] = self.mk_categories(self.workspace, count=1) [page] = self.mk_pages(self.workspace, count=1, primary_category=category.uuid) - views = SpringboardViews( + views = CoreViews( self.mk_request(matchdict={'uuid': page.uuid})) context = views.page() self.assertEqual(context['category'].uuid, category.uuid) @@ -56,7 +56,7 @@ def test_page(self): def test_flatpage(self): [page] = self.mk_pages(self.workspace, count=1) - views = SpringboardViews( + views = CoreViews( self.mk_request(matchdict={'slug': page.slug})) context = views.flat_page() self.assertEqual(context['page'].uuid, page.uuid) @@ -72,7 +72,7 @@ def test_api_notify(self, mock_delay): request = self.mk_request() request.method = 'POST' - views = SpringboardViews(request) + views = CoreViews(request) response = views.api_notify() mock_delay.assert_called_once() (working_dir, index_prefix), _ = mock_delay.call_args_list[0] @@ -88,7 +88,7 @@ def test_multiple_repos(self): 'unicore.content_repo_urls': '\n%s\n%s' % (workspace1.working_dir, workspace2.working_dir), }) - views = SpringboardViews(self.mk_request()) + views = CoreViews(self.mk_request()) indexes = map( lambda path: '%s-master' % slugify(parse_repo_name(path)), [workspace1.working_dir, workspace2.working_dir]) diff --git a/springboard/views/__init__.py b/springboard/views/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/springboard/views/base.py b/springboard/views/base.py new file mode 100644 index 0000000..65e0a21 --- /dev/null +++ b/springboard/views/base.py @@ -0,0 +1,50 @@ +import os + +from elasticgit.search import SM + +from springboard.utils import parse_repo_name + +from unicore.content.models import Category, Page + +from slugify import slugify + + +class SpringboardViews(object): + + def __init__(self, request): + self.request = request + self.language = request.locale_name + self.settings = request.registry.settings + es_host = self.settings.get('es.host', 'http://localhost:9200') + self.es_settings = { + 'urls': [es_host] + } + + repo_dir = self.settings.get('unicore.repos_dir', 'repos') + repo_names = map( + lambda repo_url: parse_repo_name(repo_url), + self.settings['unicore.content_repo_urls'].strip().split('\n')) + self.all_repo_paths = map( + lambda repo_name: os.path.join(repo_dir, repo_name), + repo_names) + self.all_index_prefixes = map( + lambda repo_name: slugify(repo_name), + repo_names) + + search_config = { + 'in_': self.all_repo_paths, + 'index_prefixes': self.all_index_prefixes + } + self.all_categories = SM(Category, **search_config).es( + **self.es_settings) + self.all_pages = SM(Page, **search_config).es(**self.es_settings) + + def context(self, **context): + defaults = { + 'user': self.request.user, + 'language': self.language, + 'all_categories': self.all_categories, + 'all_pages': self.all_pages, + } + defaults.update(context) + return defaults diff --git a/springboard/views.py b/springboard/views/core.py similarity index 54% rename from springboard/views.py rename to springboard/views/core.py index 048d4b8..e659680 100644 --- a/springboard/views.py +++ b/springboard/views/core.py @@ -1,57 +1,15 @@ import os -from elasticgit.search import SM - from pyramid.view import view_config from pyramid.view import notfound_view_config -from springboard.utils import parse_repo_name, ga_context +from springboard.utils import ga_context +from springboard.views.base import SpringboardViews -from unicore.content.models import Category, Page from unicore.distribute.tasks import fastforward -from slugify import slugify - - -class SpringboardViews(object): - - def __init__(self, request): - self.request = request - self.language = request.locale_name - self.settings = request.registry.settings - es_host = self.settings.get('es.host', 'http://localhost:9200') - self.es_settings = { - 'urls': [es_host] - } - - repo_dir = self.settings.get('unicore.repos_dir', 'repos') - repo_names = map( - lambda repo_url: parse_repo_name(repo_url), - self.settings['unicore.content_repo_urls'].strip().split('\n')) - self.all_repo_paths = map( - lambda repo_name: os.path.join(repo_dir, repo_name), - repo_names) - self.all_index_prefixes = map( - lambda repo_name: slugify(repo_name), - repo_names) - - search_config = { - 'in_': self.all_repo_paths, - 'index_prefixes': self.all_index_prefixes - } - self.all_categories = SM(Category, **search_config).es( - **self.es_settings) - self.all_pages = SM(Page, **search_config).es(**self.es_settings) - def context(self, **context): - defaults = { - 'user': self.request.user, - 'language': self.language, - 'all_categories': self.all_categories, - 'all_pages': self.all_pages, - } - defaults.update(context) - return defaults +class CoreViews(SpringboardViews): @view_config(route_name='home', renderer='springboard:templates/home.jinja2') From 985237bab3fc4b1eb50faa9c2e05d98d906a0938 Mon Sep 17 00:00:00 2001 From: Rizmari Versfeld Date: Fri, 22 May 2015 11:06:54 +0200 Subject: [PATCH 2/2] move auth views to views submodule --- springboard/auth.py | 68 +-------------------------------------- springboard/views/auth.py | 66 +++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 67 deletions(-) create mode 100644 springboard/views/auth.py diff --git a/springboard/auth.py b/springboard/auth.py index 3a631bb..62efb47 100644 --- a/springboard/auth.py +++ b/springboard/auth.py @@ -1,14 +1,9 @@ from pyramid.authentication import SessionAuthenticationPolicy from pyramid.authorization import ACLAuthorizationPolicy -from pyramid.security import forget, remember -from pyramid.view import view_config -from pyramid.httpexceptions import HTTPFound from pyramid_beaker import set_cache_regions_from_settings from unicore.hub.client import (User, - UserClient as HubUserClient, - ClientException as HubClientException) -from unicore.hub.client.utils import same_origin + UserClient as HubUserClient) USER_DATA_SESSION_KEY = 'user_data' @@ -53,64 +48,3 @@ def verify_user_in_session(user_id, request): config.set_authorization_policy(authz_policy) config.set_authentication_policy(authn_policy) config.add_request_method(user, reify=True) - - -class AuthViews(object): - - def __init__(self, request): - self.request = request - self.locale = request.locale_name - - @view_config(route_name='login') - def login(self): - hubclient = self.request.registry.hubclient - response = HTTPFound() - - # redeem ticket to get user data - ticket = self.request.GET.get('ticket', None) - if ticket: - try: - user = hubclient.get_user( - ticket, self.request.route_url('redirect_to_login')) - self.request.session[USER_DATA_SESSION_KEY] = user.data - user_id = user.get('uuid') - headers = remember(self.request, user_id) - response.headerlist.extend(headers) - - except HubClientException: - # TODO: show failed login notification to user - pass - - redirect_url = self.request.GET.get('url', None) - if not (redirect_url and same_origin( - redirect_url, self.request.current_route_url())): - redirect_url = self.request.route_url(route_name='home') - response.location = redirect_url - - return response - - @view_config(route_name='redirect_to_login') - def redirect_to_login(self): - hubclient = self.request.registry.hubclient - - if self.request.referrer and same_origin( - self.request.referrer, self.request.current_route_url()): - callback_url = self.request.route_url( - route_name='login', _query={'url': self.request.referrer}) - else: - callback_url = self.request.route_url(route_name='login') - - return HTTPFound(hubclient.get_login_redirect_url( - callback_url, locale=self.locale)) - - @view_config(route_name='logout') - def logout(self): - response = HTTPFound(headers=forget(self.request)) - - if self.request.referrer and same_origin( - self.request.referrer, self.request.current_route_url()): - response.location = self.request.referrer - else: - response.location = self.request.route_url(route_name='home') - - return response diff --git a/springboard/views/auth.py b/springboard/views/auth.py new file mode 100644 index 0000000..2d57c0f --- /dev/null +++ b/springboard/views/auth.py @@ -0,0 +1,66 @@ +from pyramid.security import forget, remember +from pyramid.view import view_config +from pyramid.httpexceptions import HTTPFound + +from unicore.hub.client import ClientException as HubClientException +from unicore.hub.client.utils import same_origin + +from springboard.auth import USER_DATA_SESSION_KEY +from springboard.views.base import SpringboardViews + + +class AuthViews(SpringboardViews): + + @view_config(route_name='login') + def login(self): + hubclient = self.request.registry.hubclient + response = HTTPFound() + + # redeem ticket to get user data + ticket = self.request.GET.get('ticket', None) + if ticket: + try: + user = hubclient.get_user( + ticket, self.request.route_url('redirect_to_login')) + self.request.session[USER_DATA_SESSION_KEY] = user.data + user_id = user.get('uuid') + headers = remember(self.request, user_id) + response.headerlist.extend(headers) + + except HubClientException: + # TODO: show failed login notification to user + pass + + redirect_url = self.request.GET.get('url', None) + if not (redirect_url and same_origin( + redirect_url, self.request.current_route_url())): + redirect_url = self.request.route_url(route_name='home') + response.location = redirect_url + + return response + + @view_config(route_name='redirect_to_login') + def redirect_to_login(self): + hubclient = self.request.registry.hubclient + + if self.request.referrer and same_origin( + self.request.referrer, self.request.current_route_url()): + callback_url = self.request.route_url( + route_name='login', _query={'url': self.request.referrer}) + else: + callback_url = self.request.route_url(route_name='login') + + return HTTPFound(hubclient.get_login_redirect_url( + callback_url, locale=self.language)) + + @view_config(route_name='logout') + def logout(self): + response = HTTPFound(headers=forget(self.request)) + + if self.request.referrer and same_origin( + self.request.referrer, self.request.current_route_url()): + response.location = self.request.referrer + else: + response.location = self.request.route_url(route_name='home') + + return response