diff -r 5595823c66f1 -r 94e76f8e9828 src/pyams_security/zmi/utility.py --- a/src/pyams_security/zmi/utility.py Sun Feb 22 14:52:32 2015 +0100 +++ b/src/pyams_security/zmi/utility.py Mon Feb 23 17:55:05 2015 +0100 @@ -29,15 +29,17 @@ # import packages from pyams_form.form import AJAXEditForm +from pyams_form.group import NamedWidgetsGroup from pyams_pagelet.pagelet import pagelet_config from pyams_security.zmi.widget import OrderedPluginsFieldWidget from pyams_skin.container import ContainerView -from pyams_skin.table import BaseTable, DefaultElementEditorAdapter, ActionColumn +from pyams_skin.table import BaseTable, DefaultElementEditorAdapter, ActionColumn, I18nColumn from pyams_skin.viewlet.menu import MenuItem from pyams_skin.viewlet.toolbar import ToolbarMenu from pyams_utils.adapter import ContextRequestViewAdapter, adapter_config from pyams_utils.registry import query_utility from pyams_utils.traversing import get_parent +from pyams_utils.url import absolute_url from pyams_viewlet.manager import viewletmanager_config from pyams_viewlet.viewlet import viewlet_config from pyams_zmi.form import AdminDialogEditForm @@ -45,6 +47,8 @@ from pyramid.url import resource_url from pyramid.view import view_config from z3c.form import field +from z3c.form.browser.checkbox import SingleCheckBoxFieldWidget +from z3c.table.column import GetAttrColumn from zope.interface import implementer, Interface from pyams_security import _ @@ -82,13 +86,29 @@ title = _("Authentication and users directory plug-ins") cssClasses = {'table': 'table table-bordered table-striped table-hover table-tight datatable'} + @property + def data_attributes(self): + manager = query_utility(ISecurityManager) + attributes = super(SecurityManagerPluginsTable, self).data_attributes + table_attrs = {'data-ams-location': absolute_url(manager, self.request), + 'data-ams-plugins': 'pyams_security', + 'data-ams-plugin-pyams_security-src': '/--static--/pyams_security/js/security.js'} + if 'table' in attributes: + attributes['table'].update(table_attrs) + else: + attributes['table'] = table_attrs + return attributes + @adapter_config(name='search', context=(Interface, IAdminLayer, SecurityManagerPluginsTable), provides=IColumn) class SecurityManagerPluginsSearchColumn(ActionColumn): """Security manager plugins search column""" + icon_class = 'fa fa-fw fa-search' + icon_hint = _("See plug-in contents") + url = "search.html" - weight = 100 + weight = 1 def renderCell(self, item): if not IDirectorySearchPlugin.providedBy(item): @@ -96,6 +116,34 @@ return super(SecurityManagerPluginsSearchColumn, self).renderCell(item) +@adapter_config(name='name', context=(Interface, IAdminLayer, SecurityManagerPluginsTable), provides=IColumn) +class SecurityManagerPluginsNameColumn(I18nColumn, GetAttrColumn): + """Security manager plugins name column""" + + _header = _("Name") + attrName = 'title' + weight = 10 + + +@adapter_config(name='trash', context=(Interface, IAdminLayer, SecurityManagerPluginsTable), provides=IColumn) +class SecurityManagerPluginsTrashColumn(ActionColumn): + """Security manager plugins trash column""" + + url = "PyAMS_security.plugins.deletePlugin" + icon_class = 'fa fa-fw fa-trash' + icon_hint = _("Delete plug-in") + weight = 100 + permission = 'system.manage' + + def renderCell(self, item): + if item.__name__ == '__system__': # can't delete system manager login plug-in!! + return '' + return super(SecurityManagerPluginsTrashColumn, self).renderCell(item) + + def get_url(self, item): + return self.url + + @adapter_config(context=(ISite, IAdminLayer, SecurityManagerPluginsTable), provides=IValues) class SecurityManagerValuesAdapter(ContextRequestViewAdapter): """Security manager values adapter""" @@ -140,7 +188,7 @@ @viewlet_config(name='security-manager.properties.menu', context=ISite, layer=IAdminLayer, - manager=ISecurityManagerMenu, permission='system.view') + manager=ISecurityManagerMenu, permission='system.view', weight=1) class SecurityManagerPropertiesMenuItem(MenuItem): """Security manager properties menu""" @@ -160,10 +208,12 @@ title = _("System security manager") legend = _("Security manager properties") icon_css_class = 'fa fa-fw fa-lock' - label_css_class = 'control-label col-md-4' - input_css_class = 'col-md-8' + label_css_class = 'control-label col-md-5' + input_css_class = 'col-md-7' fields = field.Fields(ISecurityManager) + fields['enable_social_login'].widgetFactory = SingleCheckBoxFieldWidget + fields['open_registration'].widgetFactory = SingleCheckBoxFieldWidget fields['credentials_plugins_names'].widgetFactory = OrderedPluginsFieldWidget fields['authentication_plugins_names'].widgetFactory = OrderedPluginsFieldWidget fields['directory_plugins_names'].widgetFactory = OrderedPluginsFieldWidget @@ -173,8 +223,52 @@ def getContent(self): return query_utility(ISecurityManager) + def update(self): + super(SecurityManagerEditForm, self).update() + self.add_group(NamedWidgetsGroup('social_group', self.widgets, + ('enable_social_login', 'social_users_folder', + 'authomatic_secret', 'social_login_use_popup'), + legend=_("Enable social login?"), + css_class='inner', + switch=True, + checkbox_switch=True, + checkbox_field=ISecurityManager['enable_social_login'])) + self.add_group(NamedWidgetsGroup('registry_group', self.widgets, + ('open_registration', 'users_folder'), + legend=_("Enable free registration?"), + css_class='inner', + switch=True, + checkbox_switch=True, + checkbox_field=ISecurityManager['open_registration'])) + plugins_group = NamedWidgetsGroup('plugins_group', self.widgets, + ('credentials_plugins_names', 'authentication_plugins_names', + 'directory_plugins_names'), + legend=_("Plug-ins"), + css_class='inner') + plugins_group.label_css_class = 'control-label col-md-4' + plugins_group.input_css_class = 'col-md-8' + self.add_group(plugins_group) + @view_config(name='properties.json', context=ISecurityManager, request_type=IPyAMSLayer, permission='system.manage', renderer='json', xhr=True) class SecurityManagerAJAXEditForm(AJAXEditForm, SecurityManagerEditForm): """Security manager edit form, AJAX view""" + + +@view_config(name='delete-plugin.json', context=ISecurityManager, request_type=IPyAMSLayer, + permission='system.manage', renderer='json', xhr=True) +def delete_security_manager_plugin(request): + """Delete plug-in from security manager""" + translate = request.localizer.translate + name = request.params.get('plugin_name') + if not name: + return {'status': 'message', + 'messagebox': {'status': 'error', + 'content': translate(_("No provided plugin_name argument!"))}} + if name not in request.context: + return {'status': 'message', + 'messagebox': {'status': 'error', + 'content': translate(_("Given plug-in name doesn't exist!"))}} + del request.context[name] + return {'status': 'success'}