--- 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'}