Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 1 addition & 67 deletions springboard/auth.py
Original file line number Diff line number Diff line change
@@ -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'
Expand Down Expand Up @@ -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
16 changes: 8 additions & 8 deletions springboard/tests/test_views.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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',
Expand All @@ -37,7 +37,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)
Expand All @@ -47,7 +47,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)
Expand All @@ -57,7 +57,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)
Expand All @@ -73,7 +73,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]
Expand All @@ -89,7 +89,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])
Expand Down
Empty file added springboard/views/__init__.py
Empty file.
66 changes: 66 additions & 0 deletions springboard/views/auth.py
Original file line number Diff line number Diff line change
@@ -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
59 changes: 59 additions & 0 deletions springboard/views/base.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import os

from elasticgit.search import SM

from springboard.utils import parse_repo_name, config_list

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),
config_list(self.settings['unicore.content_repo_urls']))
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)
self.available_languages = config_list(
self.settings.get('available_languages', ''))
self.featured_languages = config_list(
self.settings.get('featured_languages', ''))
self.display_languages = list(
set(self.featured_languages) - set([self.language]))

def context(self, **context):
defaults = {
'user': self.request.user,
'available_languages': self.available_languages,
'featured_languages': self.featured_languages,
'display_languages': self.display_languages,
'language': self.language,
'all_categories': self.all_categories,
'all_pages': self.all_pages,
}
defaults.update(context)
return defaults
57 changes: 3 additions & 54 deletions springboard/views.py → springboard/views/core.py
Original file line number Diff line number Diff line change
@@ -1,71 +1,20 @@
import os

from elasticgit.search import SM

from pyramid.view import view_config
from pyramid.view import notfound_view_config
from pyramid.httpexceptions import HTTPFound
from pyramid.response import Response

from springboard.utils import (
parse_repo_name, ga_context, config_list)
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

ONE_YEAR = 31536000


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),
config_list(self.settings['unicore.content_repo_urls']))
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)
self.available_languages = config_list(
self.settings.get('available_languages', ''))
self.featured_languages = config_list(
self.settings.get('featured_languages', ''))
self.display_languages = list(
set(self.featured_languages) - set([self.language]))

def context(self, **context):
defaults = {
'user': self.request.user,
'available_languages': self.available_languages,
'featured_languages': self.featured_languages,
'display_languages': self.display_languages,
'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')
Expand Down