From 8dcafe3e0eea1b0a38eee7e41e5e3ac668e05e25 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Fri, 12 Feb 2016 13:59:40 +0530 Subject: [PATCH] middleware: New middleware to check need for setup - Call the setup helper to check if a installation or update of a module is required. - Show installation and progress using the setup view. --- plinth/__main__.py | 1 + plinth/middleware.py | 75 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 plinth/middleware.py diff --git a/plinth/__main__.py b/plinth/__main__.py index b3f31ce3c..af4a82d5b 100644 --- a/plinth/__main__.py +++ b/plinth/__main__.py @@ -256,6 +256,7 @@ def configure_django(): 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'stronghold.middleware.LoginRequiredMiddleware', 'plinth.modules.first_boot.middleware.FirstBootMiddleware', + 'plinth.middleware.SetupMiddleware', ), ROOT_URLCONF='plinth.urls', SECURE_PROXY_SSL_HEADER=secure_proxy_ssl_header, diff --git a/plinth/middleware.py b/plinth/middleware.py new file mode 100644 index 000000000..b4ad0f0b4 --- /dev/null +++ b/plinth/middleware.py @@ -0,0 +1,75 @@ +# +# This file is part of Plinth. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +""" +Django middleware to show pre-setup message and setup progress. +""" + +from django.contrib import messages +from django.core.urlresolvers import resolve +from django.utils.translation import ugettext_lazy as _ +import logging + +import plinth +from plinth.package import PackageException +from . import views + + +logger = logging.getLogger(__name__) + + +class SetupMiddleware(object): + """Show setup page or progress if setup is neccessary or running.""" + + @staticmethod + def process_request(request): + """Handle a request as Django middleware request handler.""" + # Perform a URL resolution. This is slightly inefficient as + # Django will do this resolution again. + resolver_match = resolve(request.path_info) + if not resolver_match.namespaces or not len(resolver_match.namespaces): + # Requested URL does not belong to any application + return + + module_name = resolver_match.namespaces[0] + module = plinth.module_loader.loaded_modules[module_name] + + # Collect errors from any previous operations and show them + if module.setup_helper.is_finished: + exception = module.setup_helper.collect_result() + if not exception: + messages.success(request, _('Application installed.')) + else: + if isinstance(exception, PackageException): + error_string = getattr(exception, 'error_string', + str(exception)) + error_details = getattr(exception, 'error_details', '') + message = _('Error installing application: {string} ' + '{details}').format( + string=error_string, details=error_details) + else: + message = _('Error installing application: {error}') \ + .format(error=exception) + + messages.error(request, message) + + # Check if application is up-to-date + if module.setup_helper.get_state() == 'up-to-date': + return + + view = views.SetupView.as_view() + return view(request, setup_helper=module.setup_helper)