src/pyams_security/zmi/utility.py
changeset 2 94e76f8e9828
parent 0 f04e1d0a0723
child 20 c4259361b1b1
equal deleted inserted replaced
1:5595823c66f1 2:94e76f8e9828
    27 from z3c.table.interfaces import IValues, IColumn
    27 from z3c.table.interfaces import IValues, IColumn
    28 from zope.component.interfaces import ISite
    28 from zope.component.interfaces import ISite
    29 
    29 
    30 # import packages
    30 # import packages
    31 from pyams_form.form import AJAXEditForm
    31 from pyams_form.form import AJAXEditForm
       
    32 from pyams_form.group import NamedWidgetsGroup
    32 from pyams_pagelet.pagelet import pagelet_config
    33 from pyams_pagelet.pagelet import pagelet_config
    33 from pyams_security.zmi.widget import OrderedPluginsFieldWidget
    34 from pyams_security.zmi.widget import OrderedPluginsFieldWidget
    34 from pyams_skin.container import ContainerView
    35 from pyams_skin.container import ContainerView
    35 from pyams_skin.table import BaseTable, DefaultElementEditorAdapter, ActionColumn
    36 from pyams_skin.table import BaseTable, DefaultElementEditorAdapter, ActionColumn, I18nColumn
    36 from pyams_skin.viewlet.menu import MenuItem
    37 from pyams_skin.viewlet.menu import MenuItem
    37 from pyams_skin.viewlet.toolbar import ToolbarMenu
    38 from pyams_skin.viewlet.toolbar import ToolbarMenu
    38 from pyams_utils.adapter import ContextRequestViewAdapter, adapter_config
    39 from pyams_utils.adapter import ContextRequestViewAdapter, adapter_config
    39 from pyams_utils.registry import query_utility
    40 from pyams_utils.registry import query_utility
    40 from pyams_utils.traversing import get_parent
    41 from pyams_utils.traversing import get_parent
       
    42 from pyams_utils.url import absolute_url
    41 from pyams_viewlet.manager import viewletmanager_config
    43 from pyams_viewlet.manager import viewletmanager_config
    42 from pyams_viewlet.viewlet import viewlet_config
    44 from pyams_viewlet.viewlet import viewlet_config
    43 from pyams_zmi.form import AdminDialogEditForm
    45 from pyams_zmi.form import AdminDialogEditForm
    44 from pyams_zmi.view import AdminView
    46 from pyams_zmi.view import AdminView
    45 from pyramid.url import resource_url
    47 from pyramid.url import resource_url
    46 from pyramid.view import view_config
    48 from pyramid.view import view_config
    47 from z3c.form import field
    49 from z3c.form import field
       
    50 from z3c.form.browser.checkbox import SingleCheckBoxFieldWidget
       
    51 from z3c.table.column import GetAttrColumn
    48 from zope.interface import implementer, Interface
    52 from zope.interface import implementer, Interface
    49 
    53 
    50 from pyams_security import _
    54 from pyams_security import _
    51 
    55 
    52 
    56 
    80 
    84 
    81     id = 'security_manager_table'
    85     id = 'security_manager_table'
    82     title = _("Authentication and users directory plug-ins")
    86     title = _("Authentication and users directory plug-ins")
    83     cssClasses = {'table': 'table table-bordered table-striped table-hover table-tight datatable'}
    87     cssClasses = {'table': 'table table-bordered table-striped table-hover table-tight datatable'}
    84 
    88 
       
    89     @property
       
    90     def data_attributes(self):
       
    91         manager = query_utility(ISecurityManager)
       
    92         attributes = super(SecurityManagerPluginsTable, self).data_attributes
       
    93         table_attrs = {'data-ams-location': absolute_url(manager, self.request),
       
    94                        'data-ams-plugins': 'pyams_security',
       
    95                        'data-ams-plugin-pyams_security-src': '/--static--/pyams_security/js/security.js'}
       
    96         if 'table' in attributes:
       
    97             attributes['table'].update(table_attrs)
       
    98         else:
       
    99             attributes['table'] = table_attrs
       
   100         return attributes
       
   101 
    85 
   102 
    86 @adapter_config(name='search', context=(Interface, IAdminLayer, SecurityManagerPluginsTable), provides=IColumn)
   103 @adapter_config(name='search', context=(Interface, IAdminLayer, SecurityManagerPluginsTable), provides=IColumn)
    87 class SecurityManagerPluginsSearchColumn(ActionColumn):
   104 class SecurityManagerPluginsSearchColumn(ActionColumn):
    88     """Security manager plugins search column"""
   105     """Security manager plugins search column"""
    89 
   106 
       
   107     icon_class = 'fa fa-fw fa-search'
       
   108     icon_hint = _("See plug-in contents")
       
   109 
    90     url = "search.html"
   110     url = "search.html"
    91     weight = 100
   111     weight = 1
    92 
   112 
    93     def renderCell(self, item):
   113     def renderCell(self, item):
    94         if not IDirectorySearchPlugin.providedBy(item):
   114         if not IDirectorySearchPlugin.providedBy(item):
    95             return ''
   115             return ''
    96         return super(SecurityManagerPluginsSearchColumn, self).renderCell(item)
   116         return super(SecurityManagerPluginsSearchColumn, self).renderCell(item)
       
   117 
       
   118 
       
   119 @adapter_config(name='name', context=(Interface, IAdminLayer, SecurityManagerPluginsTable), provides=IColumn)
       
   120 class SecurityManagerPluginsNameColumn(I18nColumn, GetAttrColumn):
       
   121     """Security manager plugins name column"""
       
   122 
       
   123     _header = _("Name")
       
   124     attrName = 'title'
       
   125     weight = 10
       
   126 
       
   127 
       
   128 @adapter_config(name='trash', context=(Interface, IAdminLayer, SecurityManagerPluginsTable), provides=IColumn)
       
   129 class SecurityManagerPluginsTrashColumn(ActionColumn):
       
   130     """Security manager plugins trash column"""
       
   131 
       
   132     url = "PyAMS_security.plugins.deletePlugin"
       
   133     icon_class = 'fa fa-fw fa-trash'
       
   134     icon_hint = _("Delete plug-in")
       
   135     weight = 100
       
   136     permission = 'system.manage'
       
   137 
       
   138     def renderCell(self, item):
       
   139         if item.__name__ == '__system__':  # can't delete system manager login plug-in!!
       
   140             return ''
       
   141         return super(SecurityManagerPluginsTrashColumn, self).renderCell(item)
       
   142 
       
   143     def get_url(self, item):
       
   144         return self.url
    97 
   145 
    98 
   146 
    99 @adapter_config(context=(ISite, IAdminLayer, SecurityManagerPluginsTable), provides=IValues)
   147 @adapter_config(context=(ISite, IAdminLayer, SecurityManagerPluginsTable), provides=IValues)
   100 class SecurityManagerValuesAdapter(ContextRequestViewAdapter):
   148 class SecurityManagerValuesAdapter(ContextRequestViewAdapter):
   101     """Security manager values adapter"""
   149     """Security manager values adapter"""
   138 
   186 
   139     label = _("Add...")
   187     label = _("Add...")
   140 
   188 
   141 
   189 
   142 @viewlet_config(name='security-manager.properties.menu', context=ISite, layer=IAdminLayer,
   190 @viewlet_config(name='security-manager.properties.menu', context=ISite, layer=IAdminLayer,
   143                 manager=ISecurityManagerMenu, permission='system.view')
   191                 manager=ISecurityManagerMenu, permission='system.view', weight=1)
   144 class SecurityManagerPropertiesMenuItem(MenuItem):
   192 class SecurityManagerPropertiesMenuItem(MenuItem):
   145     """Security manager properties menu"""
   193     """Security manager properties menu"""
   146 
   194 
   147     label = _("Properties...")
   195     label = _("Properties...")
   148     url = 'properties.html'
   196     url = 'properties.html'
   158     """Security manager edit form"""
   206     """Security manager edit form"""
   159 
   207 
   160     title = _("System security manager")
   208     title = _("System security manager")
   161     legend = _("Security manager properties")
   209     legend = _("Security manager properties")
   162     icon_css_class = 'fa fa-fw fa-lock'
   210     icon_css_class = 'fa fa-fw fa-lock'
   163     label_css_class = 'control-label col-md-4'
   211     label_css_class = 'control-label col-md-5'
   164     input_css_class = 'col-md-8'
   212     input_css_class = 'col-md-7'
   165 
   213 
   166     fields = field.Fields(ISecurityManager)
   214     fields = field.Fields(ISecurityManager)
       
   215     fields['enable_social_login'].widgetFactory = SingleCheckBoxFieldWidget
       
   216     fields['open_registration'].widgetFactory = SingleCheckBoxFieldWidget
   167     fields['credentials_plugins_names'].widgetFactory = OrderedPluginsFieldWidget
   217     fields['credentials_plugins_names'].widgetFactory = OrderedPluginsFieldWidget
   168     fields['authentication_plugins_names'].widgetFactory = OrderedPluginsFieldWidget
   218     fields['authentication_plugins_names'].widgetFactory = OrderedPluginsFieldWidget
   169     fields['directory_plugins_names'].widgetFactory = OrderedPluginsFieldWidget
   219     fields['directory_plugins_names'].widgetFactory = OrderedPluginsFieldWidget
   170 
   220 
   171     ajax_handler = 'properties.json'
   221     ajax_handler = 'properties.json'
   172 
   222 
   173     def getContent(self):
   223     def getContent(self):
   174         return query_utility(ISecurityManager)
   224         return query_utility(ISecurityManager)
       
   225 
       
   226     def update(self):
       
   227         super(SecurityManagerEditForm, self).update()
       
   228         self.add_group(NamedWidgetsGroup('social_group', self.widgets,
       
   229                                          ('enable_social_login', 'social_users_folder',
       
   230                                           'authomatic_secret', 'social_login_use_popup'),
       
   231                                          legend=_("Enable social login?"),
       
   232                                          css_class='inner',
       
   233                                          switch=True,
       
   234                                          checkbox_switch=True,
       
   235                                          checkbox_field=ISecurityManager['enable_social_login']))
       
   236         self.add_group(NamedWidgetsGroup('registry_group', self.widgets,
       
   237                                          ('open_registration', 'users_folder'),
       
   238                                          legend=_("Enable free registration?"),
       
   239                                          css_class='inner',
       
   240                                          switch=True,
       
   241                                          checkbox_switch=True,
       
   242                                          checkbox_field=ISecurityManager['open_registration']))
       
   243         plugins_group = NamedWidgetsGroup('plugins_group', self.widgets,
       
   244                                           ('credentials_plugins_names', 'authentication_plugins_names',
       
   245                                            'directory_plugins_names'),
       
   246                                           legend=_("Plug-ins"),
       
   247                                           css_class='inner')
       
   248         plugins_group.label_css_class = 'control-label col-md-4'
       
   249         plugins_group.input_css_class = 'col-md-8'
       
   250         self.add_group(plugins_group)
   175 
   251 
   176 
   252 
   177 @view_config(name='properties.json', context=ISecurityManager, request_type=IPyAMSLayer,
   253 @view_config(name='properties.json', context=ISecurityManager, request_type=IPyAMSLayer,
   178              permission='system.manage', renderer='json', xhr=True)
   254              permission='system.manage', renderer='json', xhr=True)
   179 class SecurityManagerAJAXEditForm(AJAXEditForm, SecurityManagerEditForm):
   255 class SecurityManagerAJAXEditForm(AJAXEditForm, SecurityManagerEditForm):
   180     """Security manager edit form, AJAX view"""
   256     """Security manager edit form, AJAX view"""
       
   257 
       
   258 
       
   259 @view_config(name='delete-plugin.json', context=ISecurityManager, request_type=IPyAMSLayer,
       
   260              permission='system.manage', renderer='json', xhr=True)
       
   261 def delete_security_manager_plugin(request):
       
   262     """Delete plug-in from security manager"""
       
   263     translate = request.localizer.translate
       
   264     name = request.params.get('plugin_name')
       
   265     if not name:
       
   266         return {'status': 'message',
       
   267                 'messagebox': {'status': 'error',
       
   268                                'content': translate(_("No provided plugin_name argument!"))}}
       
   269     if name not in request.context:
       
   270         return {'status': 'message',
       
   271                 'messagebox': {'status': 'error',
       
   272                                'content': translate(_("Given plug-in name doesn't exist!"))}}
       
   273     del request.context[name]
       
   274     return {'status': 'success'}