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:
parent
1e43909507
commit
17e4461781
|
@ -93,6 +93,8 @@ STATIC_URL = '/static/'
|
|||
|
||||
# BiJoe settings
|
||||
|
||||
LOGIN_REDIRECT_URL = 'homepage'
|
||||
|
||||
LOGGING = {
|
||||
'version': 1,
|
||||
'disable_existing_loggers': True,
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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')
|
||||
|
|
2
setup.py
2
setup.py
|
@ -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})
|
||||
|
|
7
tox.ini
7
tox.ini
|
@ -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}
|
||||
|
|
Loading…
Reference in New Issue