src/pyams_security/zmi/utility.py
changeset 0 f04e1d0a0723
child 2 94e76f8e9828
equal deleted inserted replaced
-1:000000000000 0:f04e1d0a0723
       
     1 #
       
     2 # Copyright (c) 2008-2015 Thierry Florac <tflorac AT ulthar.net>
       
     3 # All Rights Reserved.
       
     4 #
       
     5 # This software is subject to the provisions of the Zope Public License,
       
     6 # Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
       
     7 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
       
     8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
       
     9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
       
    10 # FOR A PARTICULAR PURPOSE.
       
    11 #
       
    12 
       
    13 __docformat__ = 'restructuredtext'
       
    14 
       
    15 
       
    16 # import standard library
       
    17 
       
    18 # import interfaces
       
    19 from pyams_security.interfaces import ISecurityManager, IDirectorySearchPlugin
       
    20 from pyams_security.zmi.interfaces import ISecurityManagerMenu, ISecurityManagerToolbarAddingMenu
       
    21 from pyams_skin.interfaces import IInnerPage, IPageHeader
       
    22 from pyams_skin.interfaces.container import ITableElementEditor
       
    23 from pyams_skin.interfaces.viewlet import IToolbarViewletManager
       
    24 from pyams_skin.layer import IPyAMSLayer
       
    25 from pyams_zmi.interfaces.menu import IControlPanelMenu
       
    26 from pyams_zmi.layer import IAdminLayer
       
    27 from z3c.table.interfaces import IValues, IColumn
       
    28 from zope.component.interfaces import ISite
       
    29 
       
    30 # import packages
       
    31 from pyams_form.form import AJAXEditForm
       
    32 from pyams_pagelet.pagelet import pagelet_config
       
    33 from pyams_security.zmi.widget import OrderedPluginsFieldWidget
       
    34 from pyams_skin.container import ContainerView
       
    35 from pyams_skin.table import BaseTable, DefaultElementEditorAdapter, ActionColumn
       
    36 from pyams_skin.viewlet.menu import MenuItem
       
    37 from pyams_skin.viewlet.toolbar import ToolbarMenu
       
    38 from pyams_utils.adapter import ContextRequestViewAdapter, adapter_config
       
    39 from pyams_utils.registry import query_utility
       
    40 from pyams_utils.traversing import get_parent
       
    41 from pyams_viewlet.manager import viewletmanager_config
       
    42 from pyams_viewlet.viewlet import viewlet_config
       
    43 from pyams_zmi.form import AdminDialogEditForm
       
    44 from pyams_zmi.view import AdminView
       
    45 from pyramid.url import resource_url
       
    46 from pyramid.view import view_config
       
    47 from z3c.form import field
       
    48 from zope.interface import implementer, Interface
       
    49 
       
    50 from pyams_security import _
       
    51 
       
    52 
       
    53 @adapter_config(context=(ISecurityManager, IAdminLayer, Interface), provides=ITableElementEditor)
       
    54 class SecurityManagerTableElementEditor(DefaultElementEditorAdapter):
       
    55     """Security manager table element editor"""
       
    56 
       
    57     view_name = 'security-manager.html'
       
    58     modal_target = False
       
    59 
       
    60     @property
       
    61     def url(self):
       
    62         site = get_parent(self.context, ISite)
       
    63         return resource_url(site, self.request, 'admin.html#{0}'.format(self.view_name))
       
    64 
       
    65 
       
    66 @viewlet_config(name='security-manager.menu', context=ISite, layer=IAdminLayer, manager=IControlPanelMenu,
       
    67                 permission='system.view', weight=5)
       
    68 @viewletmanager_config(name='security-manager.menu', context=ISite, layer=IAdminLayer)
       
    69 @implementer(ISecurityManagerMenu)
       
    70 class SecurityManagerMenuItem(MenuItem):
       
    71     """Security manager menu"""
       
    72 
       
    73     label = _("Security")
       
    74     icon_class = 'fa fa-fw fa-lock'
       
    75     url = '#security-manager.html'
       
    76 
       
    77 
       
    78 class SecurityManagerPluginsTable(BaseTable):
       
    79     """Security manager plug-ins table"""
       
    80 
       
    81     id = 'security_manager_table'
       
    82     title = _("Authentication and users directory plug-ins")
       
    83     cssClasses = {'table': 'table table-bordered table-striped table-hover table-tight datatable'}
       
    84 
       
    85 
       
    86 @adapter_config(name='search', context=(Interface, IAdminLayer, SecurityManagerPluginsTable), provides=IColumn)
       
    87 class SecurityManagerPluginsSearchColumn(ActionColumn):
       
    88     """Security manager plugins search column"""
       
    89 
       
    90     url = "search.html"
       
    91     weight = 100
       
    92 
       
    93     def renderCell(self, item):
       
    94         if not IDirectorySearchPlugin.providedBy(item):
       
    95             return ''
       
    96         return super(SecurityManagerPluginsSearchColumn, self).renderCell(item)
       
    97 
       
    98 
       
    99 @adapter_config(context=(ISite, IAdminLayer, SecurityManagerPluginsTable), provides=IValues)
       
   100 class SecurityManagerValuesAdapter(ContextRequestViewAdapter):
       
   101     """Security manager values adapter"""
       
   102 
       
   103     @property
       
   104     def values(self):
       
   105         manager = query_utility(ISecurityManager)
       
   106         if manager is not None:
       
   107             return list(manager.values())
       
   108         return ()
       
   109 
       
   110 
       
   111 @pagelet_config(name='security-manager.html', context=ISite, layer=IPyAMSLayer, permission='system.view')
       
   112 @implementer(IInnerPage)
       
   113 class SecurityManagerView(AdminView, ContainerView):
       
   114     """Security manager view"""
       
   115 
       
   116     table_class = SecurityManagerPluginsTable
       
   117 
       
   118     def __init__(self, context, request):
       
   119         super(SecurityManagerView, self).__init__(context, request)
       
   120 
       
   121 
       
   122 @adapter_config(context=(ISite, IAdminLayer, SecurityManagerView), provides=IPageHeader)
       
   123 class SecurityManagerHeaderAdapter(ContextRequestViewAdapter):
       
   124     """Security manager header adapter"""
       
   125 
       
   126     icon_class = 'fa fa-fw fa-lock'
       
   127     title = _("Security manager")
       
   128     subtitle = _("Security manager plug-ins")
       
   129 
       
   130 
       
   131 @viewlet_config(name='security-manager.toolbar.adding', context=ISite, view=SecurityManagerPluginsTable,
       
   132                 layer=IAdminLayer, manager=IToolbarViewletManager, permission='system.manage')
       
   133 @viewletmanager_config(name='security-manager.toolbar.adding', context=ISite, view=SecurityManagerPluginsTable,
       
   134                        layer=IAdminLayer)
       
   135 @implementer(ISecurityManagerToolbarAddingMenu)
       
   136 class SecurityManagerToolbarAddingsAction(ToolbarMenu):
       
   137     """Security manager toolbar adding action"""
       
   138 
       
   139     label = _("Add...")
       
   140 
       
   141 
       
   142 @viewlet_config(name='security-manager.properties.menu', context=ISite, layer=IAdminLayer,
       
   143                 manager=ISecurityManagerMenu, permission='system.view')
       
   144 class SecurityManagerPropertiesMenuItem(MenuItem):
       
   145     """Security manager properties menu"""
       
   146 
       
   147     label = _("Properties...")
       
   148     url = 'properties.html'
       
   149     modal_target = True
       
   150 
       
   151     def get_url(self):
       
   152         manager = query_utility(ISecurityManager)
       
   153         return resource_url(manager, self.request, self.url)
       
   154 
       
   155 
       
   156 @pagelet_config(name='properties.html', context=ISecurityManager, layer=IPyAMSLayer, permission='system.view')
       
   157 class SecurityManagerEditForm(AdminDialogEditForm):
       
   158     """Security manager edit form"""
       
   159 
       
   160     title = _("System security manager")
       
   161     legend = _("Security manager properties")
       
   162     icon_css_class = 'fa fa-fw fa-lock'
       
   163     label_css_class = 'control-label col-md-4'
       
   164     input_css_class = 'col-md-8'
       
   165 
       
   166     fields = field.Fields(ISecurityManager)
       
   167     fields['credentials_plugins_names'].widgetFactory = OrderedPluginsFieldWidget
       
   168     fields['authentication_plugins_names'].widgetFactory = OrderedPluginsFieldWidget
       
   169     fields['directory_plugins_names'].widgetFactory = OrderedPluginsFieldWidget
       
   170 
       
   171     ajax_handler = 'properties.json'
       
   172 
       
   173     def getContent(self):
       
   174         return query_utility(ISecurityManager)
       
   175 
       
   176 
       
   177 @view_config(name='properties.json', context=ISecurityManager, request_type=IPyAMSLayer,
       
   178              permission='system.manage', renderer='json', xhr=True)
       
   179 class SecurityManagerAJAXEditForm(AJAXEditForm, SecurityManagerEditForm):
       
   180     """Security manager edit form, AJAX view"""