src/pyams_security/zmi/utility.py
changeset 2 94e76f8e9828
parent 0 f04e1d0a0723
child 20 c4259361b1b1
--- 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'}