Minor refactoring and lint fixes

- Rename AdminMiddleware to AdminRequiredMiddleware to be consistent
  with stronghold/Django terminology

- Simplify .gitignore pattern

- Format single line docstrings as per PEP8.

- Add missing docstrings.

- Restrict lines to 79 characters.
This commit is contained in:
Sunil Mohan Adapa 2017-02-15 16:41:34 +05:30 committed by Sunil Mohan Adapa
parent 4699b201a9
commit dd5ab7612e
No known key found for this signature in database
GPG Key ID: 43EA1CFF0AA7C5F2
9 changed files with 27 additions and 25 deletions

2
.gitignore vendored
View File

@ -22,4 +22,4 @@ plinth/tests/coverage/report/
*.mo
.vagrant/
.idea/
**\.DS_Store
.DS_Store

View File

@ -227,7 +227,7 @@ def configure_django():
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'plinth.middleware.AdminMiddleware',
'plinth.middleware.AdminRequiredMiddleware',
'stronghold.middleware.LoginRequiredMiddleware',
'plinth.modules.first_boot.middleware.FirstBootMiddleware',
'plinth.middleware.SetupMiddleware',

View File

@ -38,9 +38,7 @@ logger = logging.getLogger(__name__)
class SetupMiddleware(object):
"""
Django middleware to show pre-setup message and setup progress.
"""
"""Django middleware to show pre-setup message and setup progress."""
@staticmethod
def process_view(request, view_func, view_args, view_kwargs):
@ -93,14 +91,14 @@ class SetupMiddleware(object):
return view(request, setup_helper=module.setup_helper)
class AdminMiddleware(object):
"""
Django middleware for authenticating requests for admin areas
"""
class AdminRequiredMiddleware(object):
"""Django middleware for authenticating requests for admin areas."""
@staticmethod
def process_view(request, view_func, view_args, view_kwargs):
if is_view_func_public(view_func) or hasattr(view_func, 'IS_NON_ADMIN'):
"""Reject non-admin access to views that are private and not marked."""
if is_view_func_public(view_func) or \
hasattr(view_func, 'IS_NON_ADMIN'):
return
if not request.user.groups.filter(name='admin').exists():

View File

@ -28,5 +28,6 @@ from . import views
urlpatterns = [
url(r'^apps/openvpn/$', views.index, name='index'),
url(r'^apps/openvpn/setup/$', views.setup, name='setup'),
url(r'^apps/openvpn/profile/$', non_admin_view(views.profile), name='profile'),
url(r'^apps/openvpn/profile/$', non_admin_view(views.profile),
name='profile'),
]

View File

@ -31,12 +31,13 @@ from . import views
urlpatterns = [
url(r'^sys/users/$', views.UserList.as_view(), name='index'),
url(r'^sys/users/create/$', views.UserCreate.as_view(), name='create'),
url(r'^sys/users/(?P<slug>[\w.@+-]+)/edit/$', non_admin_view(views.UserUpdate.as_view()),
name='edit'),
url(r'^sys/users/(?P<slug>[\w.@+-]+)/edit/$',
non_admin_view(views.UserUpdate.as_view()), name='edit'),
url(r'^sys/users/(?P<slug>[\w.@+-]+)/delete/$', views.UserDelete.as_view(),
name='delete'),
url(r'^sys/users/(?P<slug>[\w.@+-]+)/change_password/$',
non_admin_view(views.UserChangePassword.as_view()), name='change_password'),
non_admin_view(views.UserChangePassword.as_view()),
name='change_password'),
# Add Django's login/logout urls
url(r'^accounts/login/$', public(auth_views.login),
{'template_name': 'login.html'}, name='login'),

View File

@ -82,11 +82,12 @@ class UserUpdate(ContextMixin, SuccessMessageMixin, UpdateView):
title = ugettext_lazy('Edit User')
def dispatch(self, request, *args, **kwargs):
"""Handle a request and return a HTTP response."""
if self.request.user.get_username() != self.kwargs['slug'] \
and not self.request.user.groups.filter(name='admin').exists():
and not self.request.user.groups.filter(name='admin').exists():
raise PermissionDenied
return super(UserUpdate, self).dispatch(request, *args, **kwargs)
return super().dispatch(request, *args, **kwargs)
def get_form_kwargs(self):
"""Make the requst object available to the form."""
@ -152,11 +153,12 @@ class UserChangePassword(ContextMixin, SuccessMessageMixin, FormView):
success_message = ugettext_lazy('Password changed successfully.')
def dispatch(self, request, *args, **kwargs):
"""Handle a request and return a HTTP response."""
if self.request.user.get_username() != self.kwargs['slug'] \
and not self.request.user.groups.filter(name='admin').exists():
and not self.request.user.groups.filter(name='admin').exists():
raise PermissionDenied
return super(UserChangePassword, self).dispatch(request, *args, **kwargs)
return super().dispatch(request, *args, **kwargs)
def get_form_kwargs(self):
"""Make the user object available to the form."""

View File

@ -29,7 +29,7 @@ from django.test.client import RequestFactory
from stronghold.decorators import public
from plinth import cfg
from plinth.middleware import SetupMiddleware, AdminMiddleware
from plinth.middleware import SetupMiddleware, AdminRequiredMiddleware
class TestSetupMiddleware(TestCase):
@ -148,7 +148,6 @@ class TestAdminMiddleware(TestCase):
"""Setup each test case before execution."""
super(TestAdminMiddleware, self).setUp()
self.middleware = AdminMiddleware()
@patch('django.contrib.messages.success')
@patch('plinth.module_loader.loaded_modules')
@ -157,6 +156,7 @@ class TestAdminMiddleware(TestCase):
def test_that_admin_view_is_denied_for_usual_user(self, reverse, resolve, loaded_modules, messages_success):
"""Test that normal user is denied for an admin view"""
self.middleware = AdminRequiredMiddleware()
self.kwargs = {
'view_func': HttpResponse,
'view_args': [],

View File

@ -47,7 +47,6 @@ format_lazy = lazy(_format_lazy, str)
def non_admin_view(func):
"""Decorator to mark a view as non admin."""
setattr(func, "IS_NON_ADMIN", True)
"""Decorator to mark a view as accesible by non-admin users."""
setattr(func, 'IS_NON_ADMIN', True)
return func

View File

@ -38,12 +38,13 @@ def index(request):
shortcuts = frontpage.get_shortcuts()
selection = request.GET.get('selected')
details, details_label, configure_url= None, None, None
details, details_label, configure_url = None, None, None
if selection in frontpage.shortcuts:
details = frontpage.shortcuts[selection]['details']
details_label = frontpage.shortcuts[selection]['label']
configure_url = frontpage.shortcuts[selection]['configure_url']
user_is_admin = request.user.groups.filter(name='admin').exists()
return TemplateResponse(request, 'index.html',
{'title': _('FreedomBox'),
'shortcuts': shortcuts,
@ -51,7 +52,7 @@ def index(request):
'details': details,
'details_label': details_label,
'configure_url': configure_url,
'user_is_admin': request.user.groups.filter(name='admin').exists()})
'user_is_admin': user_is_admin})
class ServiceView(FormView):