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 *.mo
.vagrant/ .vagrant/
.idea/ .idea/
**\.DS_Store .DS_Store

View File

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

View File

@ -38,9 +38,7 @@ logger = logging.getLogger(__name__)
class SetupMiddleware(object): class SetupMiddleware(object):
""" """Django middleware to show pre-setup message and setup progress."""
Django middleware to show pre-setup message and setup progress.
"""
@staticmethod @staticmethod
def process_view(request, view_func, view_args, view_kwargs): 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) return view(request, setup_helper=module.setup_helper)
class AdminMiddleware(object): class AdminRequiredMiddleware(object):
""" """Django middleware for authenticating requests for admin areas."""
Django middleware for authenticating requests for admin areas
"""
@staticmethod @staticmethod
def process_view(request, view_func, view_args, view_kwargs): 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 return
if not request.user.groups.filter(name='admin').exists(): if not request.user.groups.filter(name='admin').exists():

View File

@ -28,5 +28,6 @@ from . import views
urlpatterns = [ urlpatterns = [
url(r'^apps/openvpn/$', views.index, name='index'), url(r'^apps/openvpn/$', views.index, name='index'),
url(r'^apps/openvpn/setup/$', views.setup, name='setup'), 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 = [ urlpatterns = [
url(r'^sys/users/$', views.UserList.as_view(), name='index'), 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/create/$', views.UserCreate.as_view(), name='create'),
url(r'^sys/users/(?P<slug>[\w.@+-]+)/edit/$', non_admin_view(views.UserUpdate.as_view()), url(r'^sys/users/(?P<slug>[\w.@+-]+)/edit/$',
name='edit'), non_admin_view(views.UserUpdate.as_view()), name='edit'),
url(r'^sys/users/(?P<slug>[\w.@+-]+)/delete/$', views.UserDelete.as_view(), url(r'^sys/users/(?P<slug>[\w.@+-]+)/delete/$', views.UserDelete.as_view(),
name='delete'), name='delete'),
url(r'^sys/users/(?P<slug>[\w.@+-]+)/change_password/$', 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 # Add Django's login/logout urls
url(r'^accounts/login/$', public(auth_views.login), url(r'^accounts/login/$', public(auth_views.login),
{'template_name': 'login.html'}, name='login'), {'template_name': 'login.html'}, name='login'),

View File

@ -82,11 +82,12 @@ class UserUpdate(ContextMixin, SuccessMessageMixin, UpdateView):
title = ugettext_lazy('Edit User') title = ugettext_lazy('Edit User')
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
"""Handle a request and return a HTTP response."""
if self.request.user.get_username() != self.kwargs['slug'] \ 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 raise PermissionDenied
return super(UserUpdate, self).dispatch(request, *args, **kwargs) return super().dispatch(request, *args, **kwargs)
def get_form_kwargs(self): def get_form_kwargs(self):
"""Make the requst object available to the form.""" """Make the requst object available to the form."""
@ -152,11 +153,12 @@ class UserChangePassword(ContextMixin, SuccessMessageMixin, FormView):
success_message = ugettext_lazy('Password changed successfully.') success_message = ugettext_lazy('Password changed successfully.')
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
"""Handle a request and return a HTTP response."""
if self.request.user.get_username() != self.kwargs['slug'] \ 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 raise PermissionDenied
return super(UserChangePassword, self).dispatch(request, *args, **kwargs) return super().dispatch(request, *args, **kwargs)
def get_form_kwargs(self): def get_form_kwargs(self):
"""Make the user object available to the form.""" """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 stronghold.decorators import public
from plinth import cfg from plinth import cfg
from plinth.middleware import SetupMiddleware, AdminMiddleware from plinth.middleware import SetupMiddleware, AdminRequiredMiddleware
class TestSetupMiddleware(TestCase): class TestSetupMiddleware(TestCase):
@ -148,7 +148,6 @@ class TestAdminMiddleware(TestCase):
"""Setup each test case before execution.""" """Setup each test case before execution."""
super(TestAdminMiddleware, self).setUp() super(TestAdminMiddleware, self).setUp()
self.middleware = AdminMiddleware()
@patch('django.contrib.messages.success') @patch('django.contrib.messages.success')
@patch('plinth.module_loader.loaded_modules') @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): 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""" """Test that normal user is denied for an admin view"""
self.middleware = AdminRequiredMiddleware()
self.kwargs = { self.kwargs = {
'view_func': HttpResponse, 'view_func': HttpResponse,
'view_args': [], 'view_args': [],

View File

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

View File

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