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