Source code for chrysalio.includes.modules.models

"""SQLAlchemy-powered model definitions for modules."""

from pkg_resources import get_distribution

from sqlalchemy import Column, String, Boolean
import colander

from ...lib.i18n import _
from ...models import DBDeclarativeClass, MODULE_LEN
from ...helpers.literal import Literal


MODULES_SUFFIX = 'ciomod'


# =============================================================================
[docs] class DBModule(DBDeclarativeClass): # type: ignore """SQLAlchemy-powered module class.""" __tablename__ = 'modules' __table_args__ = {'mysql_engine': 'InnoDB'} module_id = Column(String(MODULE_LEN), primary_key=True) inactive = Column(Boolean(name='inactive'), default=True) suffix = MODULES_SUFFIX # -------------------------------------------------------------------------
[docs] @classmethod def table4view(cls, request): """Generate the modules table. :type request: pyramid.request.Request :param request: Current request. :rtype: helpers.literal.Literal """ translate = request.localizer.translate if 'modules' not in request.registry or \ not request.registry['modules']: return translate(_('No module.')) names = {k: translate(request.registry['modules'][k].name) for k in request.registry['modules']} html = '<table>\n<thead>\n'\ '<tr><th>{active}</th><th>{name}</th><th>{version}</th>'\ '<th>{depends}</th><th class="cioActions">{actions}</th></tr>\n'\ '</thead>\n<tbody>\n'.format( active=translate(_('Active')), name=translate(_('Name')), version=translate(_('Version')), depends=translate(_('Dependencies')), actions=translate(_('Actions'))) for module_id in request.registry['modules']: module = request.registry['modules'][module_id] dependencies = ', '.join( [names[k] for k in module.dependencies if k in names]) \ if module.dependencies else '' actions = module.configuration_route(request) or '' if actions: actions = f'<a href="{actions}" title="Configuration"' \ ' class="cioIconButton cioButtonConfigure"></a> ' html += '<tr><td>{active}</td><td title="{id}">{name}</td>'\ '<td>{version}</td><td>{depends}</td>'\ '<td class="cioActions">{actions}</td></tr>\n'.format( active='' if module_id in request.registry['modules_off'] else '✔', id=module_id, name=translate(module.name), version=get_distribution(module_id.split('.')[0]).version, depends=dependencies, actions=actions) html += '</tbody>\n</table>\n' return Literal(html)
# -------------------------------------------------------------------------
[docs] @classmethod def settings_schema(cls, request): """Return a Colander schema to edit modules. :type request: pyramid.request.Request :param request: Current request. :rtype: tuple :return: A tuple such as ``(schema, defaults)``. """ schema = colander.SchemaNode(colander.Mapping()) for module_id in request.registry['modules']: schema.add(colander.SchemaNode( colander.Boolean(), name=module_id, missing=False)) # Defaults defaults = {} for module_id in request.registry['modules']: if module_id not in request.registry['modules_off']: defaults[module_id] = True return schema, defaults
# -------------------------------------------------------------------------
[docs] @classmethod def table4edit(cls, request, form): """Generate the modules table for edition. :type request: pyramid.request.Request :param request: Current request. :type form: .lib.form.Form :param form: Current form object. :rtype: helpers.literal.Literal """ translate = request.localizer.translate if 'modules' not in request.registry or \ not request.registry['modules']: return translate(_('No module.')) names = {k: translate(request.registry['modules'][k].name) for k in request.registry['modules']} html = '<table>\n<thead>\n'\ '<tr><th>{selected}</th><th>{name}</th><th>{version}</th>'\ '<th>{depends}</th></tr>\n</thead>\n<tbody>\n'.format( selected=translate(_('Active')), name=translate(_('Name')), version=translate(_('Version')), depends=translate(_('Dependencies'))) for module_id in request.registry['modules']: module = request.registry['modules'][module_id] dependencies = ', '.join( [names[k] for k in module.dependencies if k in names]) \ if module.dependencies else '' html += '<tr><td>{selected}</td>'\ '<td><label for="{cid}" title="{id}">{name}</label></td>'\ '<td>{version}</td><td>{depends}</td></tr>\n'.format( selected=form.custom_checkbox(module_id), name=translate(module.name), cid=module_id.replace('.', ''), id=module_id, version=get_distribution(module_id.split('.')[0]).version, depends=dependencies) html += '</tbody>\n</table>\n' return Literal(html)