add more tests and publik integration

- authorization based on superuser status of users
- menu.json view for portal agent integration
- login/logout page for standalone launch
- tests of basic access control on menu.json and homepage views
This commit is contained in:
Benjamin Dauvergne 2016-07-14 10:21:00 +02:00
parent 1e43909507
commit 17e4461781
5 changed files with 80 additions and 12 deletions

View File

@ -93,6 +93,8 @@ STATIC_URL = '/static/'
# BiJoe settings
LOGIN_REDIRECT_URL = 'homepage'
LOGGING = {
'version': 1,
'disable_existing_loggers': True,

View File

@ -23,9 +23,12 @@ import views
urlpatterns = patterns(
'',
url(r'^$', views.homepage, name='homepage'),
url(r'^admin/', include(admin.site.urls)),
url(r'^accounts/login/$', views.login, name='login'),
url(r'^accounts/logout/$', views.logout, name='logout'),
url(r'^manage/menu.json$', views.menu_json, name='menu-json'),
url(r'^(?P<warehouse>[^/]*)/$', views.warehouse, name='warehouse'),
url(r'^(?P<warehouse>[^/]*)/(?P<cube>[^/]*)/$', views.cube, name='cube'),
url(r'^admin/', include(admin.site.urls)),
)
if 'mellon' in settings.INSTALLED_APPS:

View File

@ -17,10 +17,22 @@
import json
import datetime
import decimal
import urllib
from django.views.generic import TemplateView, FormView
from django.http import Http404, HttpResponse
from django.contrib.auth.decorators import login_required
from django.shortcuts import resolve_url
from django.core.urlresolvers import reverse
from django.views.generic import TemplateView, FormView, View
from django.http import Http404, HttpResponse, HttpResponseRedirect
from django.shortcuts import render
from django.utils.translation import ugettext as _
from django.contrib.auth import logout as auth_logout
from django.contrib.auth import views as auth_views
from django.contrib.auth.views import redirect_to_login
try:
from mellon.utils import get_idps
except ImportError:
get_idps = lambda: []
from .utils import get_warehouses
from .engine import Engine
@ -28,7 +40,17 @@ from .forms import CubeForm
from .ods import Workbook
class HomepageView(TemplateView):
class AuthorizationMixin(object):
def dispatch(self, request, *args, **kwargs):
if self.request.user.is_authenticated():
if self.request.user.is_superuser:
return super(AuthorizationMixin, self).dispatch(request, *args, **kwargs)
return render(request, 'bijoe/unauthorized.html', status=403)
else:
return redirect_to_login(request.build_absolute_uri())
class HomepageView(AuthorizationMixin, TemplateView):
template_name = 'bijoe/homepage.html'
def get_context_data(self, **kwargs):
@ -38,7 +60,7 @@ class HomepageView(TemplateView):
return ctx
class WarehouseView(TemplateView):
class WarehouseView(AuthorizationMixin, TemplateView):
template_name = 'bijoe/warehouse.html'
def get_context_data(self, **kwargs):
@ -84,7 +106,7 @@ class CubeMixin(object):
return data
class CubeView(CubeMixin, FormView):
class CubeView(AuthorizationMixin, CubeMixin, FormView):
template_name = 'bijoe/cube.html'
form_class = CubeForm
@ -154,6 +176,42 @@ class CubeView(CubeMixin, FormView):
ctx['json'] = json.dumps(json_data, indent=2)
return ctx
homepage = login_required(HomepageView.as_view())
warehouse = login_required(WarehouseView.as_view())
cube = login_required(CubeView.as_view())
class MenuJSONView(AuthorizationMixin, View):
def get(self, request, *args, **kwargs):
response = HttpResponse(content_type='application/json')
menu = [
{
'label': _('Statistics'),
'slug': 'statistics',
'url': request.build_absolute_uri(reverse('homepage')),
}
]
response.write(json.dumps(menu))
return response
homepage = HomepageView.as_view()
warehouse = WarehouseView.as_view()
cube = CubeView.as_view()
menu_json = MenuJSONView.as_view()
def login(request, *args, **kwargs):
if any(get_idps()):
if not 'next' in request.GET:
return HttpResponseRedirect(resolve_url('mellon_login'))
return HttpResponseRedirect(resolve_url('mellon_login') + '?next='
+ urllib.quote(request.GET.get('next')))
return auth_views.login(request, template_name='bijoe/login.html')
def logout(request, next_page=None):
if any(get_idps()):
return HttpResponseRedirect(resolve_url('mellon_logout'))
auth_logout(request)
if next_page is not None:
next_page = resolve_url(next_page)
else:
next_page = '/'
return HttpResponseRedirect(next_page, template_name='bijoe/logged_out.html')

View File

@ -55,6 +55,6 @@ setup(name="bijoe",
packages=find_packages(),
include_package_data=True,
install_requires=['requests', 'django', 'psycopg2', 'isodate', 'Django-Select2',
'XStatic-ChartNew.js'],
'XStatic-ChartNew.js', 'gadjo'],
scripts=['bijoe-ctl'],
cmdclass={'sdist': eo_sdist})

View File

@ -9,11 +9,16 @@ toxworkdir = {env:TMPDIR:/tmp}/tox-{env:USER}/bijoe/
[testenv]
usedevelop = true
setenv =
DJANGO_SETTINGS_MODULE=bijoe.settings
coverage: COVERAGE=--junit-xml=junit.xml --cov=src --cov-report xml
deps =
django>=1.7,<1.8
coverage
pytest
pytest-cov
pytest-random
pytest-django
WebTest
django-webtest
commands =
py.test {env:COVERAGE:} {posargs:--random tests}
py.test {env:COVERAGE:} {posargs:--nomigrations --random tests}