"""View callables."""
from pyramid.view import view_config
from pyramid.httpexceptions import HTTPFound
from ...lib.i18n import _
from ...lib.log import log_info
from ...lib.form import get_action, Form
from ...lib.menu import Menu
from ...views import BaseView
from .models import DBModule
# =============================================================================
[docs]
class ModulesView(BaseView):
"""Class to manage modules.
:type request: pyramid.request.Request
:param request:
Current request.
"""
# -------------------------------------------------------------------------
[docs]
@view_config(
route_name='modules_view',
renderer='chrysalio:includes/modules/Templates/modules_view.pt',
permission='modules-view')
def view(self):
"""Show modules."""
i_editor = self._request.has_permission('modules-edit')
self._request.breadcrumbs(
_('Modules'), 1,
replace=self._request.route_path('modules_edit'))
self._request.documentation = '/admin/modules/view'
return {
'form': Form(self._request), 'dbmodules': DBModule,
'i_editor': i_editor}
# -------------------------------------------------------------------------
[docs]
@view_config(
route_name='modules_edit',
renderer='chrysalio:includes/modules/Templates/modules_edit.pt',
permission='modules-edit')
def edit(self):
"""Edit modules."""
form = Form(self._request, *DBModule.settings_schema(self._request))
action = get_action(self._request)[0]
if action == 'sav!' and form.validate():
self._save([k for k in form.values if form.values[k]])
log_info(self._request, 'modules_edit')
return HTTPFound(self._request.route_path('modules_view'))
self._request.breadcrumbs(
_('Modules Edition'), 1,
replace=self._request.route_path('modules_view'))
self._request.documentation = '/admin/modules/edit'
return {'form': form, 'dbmodules': DBModule, 'action': action}
# -------------------------------------------------------------------------
def _save(self, after):
"""Save modules.
:param list after:
List of desired active modules after update.
"""
modules = self._request.registry['modules']
before = [k for k in modules
if k not in self._request.registry['modules_off']]
active = set()
to_activate = set()
# Process newly activated
for module_id in modules:
if module_id in after:
if module_id in before:
active.add(module_id)
else:
to_activate.add(module_id)
self._activate_module_dependencies(module_id, to_activate)
# Process newly deactivated
for module_id in modules:
if module_id not in after and module_id in before and \
module_id not in to_activate:
self._deactivate_module_depending(module_id, active)
# Modules to activate
to_activate |= active
# Activate/deactivate modules and update modules table
self._update_modules(modules, to_activate)
# Update menu (DEPRECATED)
Menu.invalidate(self._request, 'menu')
# -------------------------------------------------------------------------
def _update_modules(self, modules, to_activate):
"""Activate/deactivate modules and update modules table.
:type modules: OrderedDict
:param modules:
Dictionary of available modules.
:param set to_activate:
Set of modules to activate.
"""
before = [k for k in self._request.registry['modules']
if k not in self._request.registry['modules_off']]
for module_id in modules:
newly_active = module_id in to_activate
if newly_active and module_id not in before:
modules[module_id].activate(
self._request.registry, self._request.dbsession)
self._request.registry['modules_off'].remove(module_id)
elif not newly_active and module_id in before:
modules[module_id].deactivate(
self._request.registry, self._request.dbsession)
self._request.registry['modules_off'].add(module_id)
dbmodule = self._request.dbsession.query(DBModule).filter_by(
module_id=module_id).first()
if newly_active and dbmodule is not None:
self._request.dbsession.delete(dbmodule)
elif not newly_active and dbmodule is None:
self._request.dbsession.add(DBModule(
module_id=module_id, inactive=True))
# -------------------------------------------------------------------------
def _activate_module_dependencies(self, module_id, activated):
"""Recursive method to activate dependencies of the module
``module_id``.
:param str module_id:
ID of the reference module.
:param set activated:
Set of already activated moodules
"""
modules = self._request.registry['modules']
for depend_id in modules[module_id].dependencies:
if depend_id in modules and depend_id not in activated:
activated.add(depend_id)
self._activate_module_dependencies(depend_id, activated)
# -------------------------------------------------------------------------
def _deactivate_module_depending(self, module_id, active):
"""Recursive method to deactivate modules depending on the module
``module_id``.
:param str module_id:
ID of the reference module.
:param set activated:
Set of already activated moodules
"""
for active_id in active.copy():
if module_id in self._request.registry[
'modules'][active_id].dependencies:
active.remove(active_id)
self._deactivate_module_depending(active_id, active)