12 |
12 |
13 __docformat__ = 'restructuredtext' |
13 __docformat__ = 'restructuredtext' |
14 |
14 |
15 |
15 |
16 # import standard library |
16 # import standard library |
|
17 import pprint |
|
18 import sys |
|
19 import traceback |
17 |
20 |
18 # import interfaces |
21 # import interfaces |
|
22 from pyams_form.interfaces.form import IWidgetsSuffixViewletsManager |
19 from pyams_skin.interfaces.container import ITableElementName |
23 from pyams_skin.interfaces.container import ITableElementName |
20 from pyams_skin.interfaces.viewlet import IToolbarAddingMenu |
24 from pyams_skin.interfaces.viewlet import IToolbarAddingMenu, ITableItemColumnActionsMenu |
21 from pyams_skin.layer import IPyAMSLayer |
25 from pyams_skin.layer import IPyAMSLayer |
22 from pyams_utils.interfaces import VIEW_SYSTEM_PERMISSION, MANAGE_SYSTEM_PERMISSION |
26 from pyams_utils.interfaces import VIEW_SYSTEM_PERMISSION, MANAGE_SYSTEM_PERMISSION |
23 from pyams_utils.interfaces.zeo import IZEOConnection |
27 from pyams_utils.interfaces.zeo import IZEOConnection |
24 from pyams_zmi.layer import IAdminLayer |
28 from pyams_zmi.layer import IAdminLayer |
25 from z3c.form.interfaces import IDataExtractedEvent, DISPLAY_MODE |
29 from z3c.form.interfaces import IDataExtractedEvent, DISPLAY_MODE |
26 from zope.component.interfaces import ISite |
30 from zope.component.interfaces import ISite |
27 |
31 |
28 # import packages |
32 # import packages |
29 from pyams_form.form import AJAXAddForm, AJAXEditForm |
33 from pyams_form.form import AJAXAddForm, AJAXEditForm |
|
34 from pyams_form.schema import CloseButton |
30 from pyams_pagelet.pagelet import pagelet_config |
35 from pyams_pagelet.pagelet import pagelet_config |
31 from pyams_skin.viewlet.toolbar import ToolbarMenuItem |
36 from pyams_skin.viewlet.toolbar import ToolbarMenuItem |
|
37 from pyams_template.template import template_config |
32 from pyams_utils.adapter import adapter_config, ContextRequestAdapter |
38 from pyams_utils.adapter import adapter_config, ContextRequestAdapter |
33 from pyams_utils.registry import query_utility |
39 from pyams_utils.registry import query_utility |
34 from pyams_utils.url import absolute_url |
40 from pyams_utils.url import absolute_url |
35 from pyams_utils.zodb import ZEOConnectionUtility |
41 from pyams_utils.zodb import ZEOConnectionUtility |
36 from pyams_viewlet.viewlet import viewlet_config |
42 from pyams_viewlet.viewlet import viewlet_config, Viewlet |
37 from pyams_zmi.control_panel import UtilitiesTable |
43 from pyams_zmi.control_panel import UtilitiesTable |
38 from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm |
44 from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm |
39 from pyramid.events import subscriber |
45 from pyramid.events import subscriber |
40 from pyramid.view import view_config |
46 from pyramid.view import view_config |
41 from z3c.form import field |
47 from z3c.form import field, button |
42 from zope.interface import Invalid |
48 from zope.interface import Interface, Invalid |
43 |
49 |
44 from pyams_utils import _ |
50 from pyams_utils import _ |
45 |
51 |
46 |
52 |
47 @adapter_config(context=(IZEOConnection, IAdminLayer), provides=ITableElementName) |
53 @adapter_config(context=(IZEOConnection, IAdminLayer), provides=ITableElementName) |
131 |
137 |
132 @view_config(name='properties.json', context=IZEOConnection, request_type=IPyAMSLayer, |
138 @view_config(name='properties.json', context=IZEOConnection, request_type=IPyAMSLayer, |
133 permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True) |
139 permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True) |
134 class ZEOConnectionPropertiesAJAXEditForm(AJAXEditForm, ZEOConnectionPropertiesEditForm): |
140 class ZEOConnectionPropertiesAJAXEditForm(AJAXEditForm, ZEOConnectionPropertiesEditForm): |
135 """ZEO connection properties edit form, AJAX view""" |
141 """ZEO connection properties edit form, AJAX view""" |
|
142 |
|
143 |
|
144 # |
|
145 # ZEO connection test form |
|
146 # |
|
147 |
|
148 @viewlet_config(name='test-connection.menu', context=IZEOConnection, layer=IAdminLayer, |
|
149 view=UtilitiesTable, manager=ITableItemColumnActionsMenu, permission=MANAGE_SYSTEM_PERMISSION) |
|
150 class ZEOConnectionTestMenu(ToolbarMenuItem): |
|
151 """ZEO connection test menu""" |
|
152 |
|
153 label = _("Test ZEO connection...") |
|
154 label_css_class = 'fa fa-fw fa-database' |
|
155 url = 'test-connection.html' |
|
156 modal_target = True |
|
157 stop_propagation = True |
|
158 |
|
159 |
|
160 class IZEOConnectionTestButtons(Interface): |
|
161 """ZEO connection test buttons""" |
|
162 |
|
163 close = CloseButton(name='close', title=_("Close")) |
|
164 test = button.Button(name='test', title=_("Test connection")) |
|
165 |
|
166 |
|
167 @pagelet_config(name='test-connection.html', context=IZEOConnection, layer=IPyAMSLayer, |
|
168 permission=MANAGE_SYSTEM_PERMISSION) |
|
169 class ZEOConnectionTestForm(AdminDialogAddForm): |
|
170 """ZEO connection test form""" |
|
171 |
|
172 @property |
|
173 def title(self): |
|
174 translate = self.request.localizer.translate |
|
175 return translate(_("ZEO connection: {0}")).format(self.context.name) |
|
176 |
|
177 legend = _("Test ZEO database connection") |
|
178 icon_css_class = 'fa fa-fw fa-database' |
|
179 |
|
180 prefix = 'test_form.' |
|
181 fields = field.Fields(Interface) |
|
182 buttons = button.Buttons(IZEOConnectionTestButtons) |
|
183 ajax_handler = 'test-connection.json' |
|
184 edit_permission = MANAGE_SYSTEM_PERMISSION |
|
185 |
|
186 @property |
|
187 def form_target(self): |
|
188 return '#{0}_test_result'.format(self.id) |
|
189 |
|
190 def updateActions(self): |
|
191 super(ZEOConnectionTestForm, self).updateActions() |
|
192 if 'test' in self.actions: |
|
193 self.actions['test'].addClass('btn-primary') |
|
194 |
|
195 def createAndAdd(self, data): |
|
196 try: |
|
197 self.context.get_connection() |
|
198 except: |
|
199 typ, value, tb = sys.exc_info() |
|
200 return 500, (typ, value, tb) |
|
201 else: |
|
202 return 200, 'OK - ZEO connection successful' |
|
203 |
|
204 |
|
205 @viewlet_config(name='test-connection.suffix', layer=IAdminLayer, manager=IWidgetsSuffixViewletsManager, |
|
206 view=ZEOConnectionTestForm, weight=50) |
|
207 @template_config(template='templates/connection-test.pt') |
|
208 class ZEOConnectionTestFormSuffix(Viewlet): |
|
209 """ZEO connection test form suffix""" |
|
210 |
|
211 |
|
212 @view_config(name='test-connection.json', context=IZEOConnection, request_type=IPyAMSLayer, |
|
213 permission=MANAGE_SYSTEM_PERMISSION, renderer='json', xhr=True) |
|
214 class ZEOConnectionAJAXTestForm(AJAXAddForm, ZEOConnectionTestForm): |
|
215 """ZEO connection test form, JSON renderer""" |
|
216 |
|
217 def get_ajax_output(self, changes): |
|
218 settings = '{0}\n\n'.format(pprint.pformat(self.context.get_settings())) |
|
219 status, arguments = changes |
|
220 if status == 200: |
|
221 return {'status': 'success', |
|
222 'content': {'html': '{0}<br />{1}'.format(settings, arguments)}, |
|
223 'close_form': False} |
|
224 else: |
|
225 typ, value, tb = arguments |
|
226 message = 'An error occurred: {type}<br />{message}'.format(type=typ, |
|
227 message='<br />'.join( |
|
228 traceback.format_exception(typ, value, tb))) |
|
229 return {'status': 'info', |
|
230 'content': {'html': '{0}<br />{1}'.format(settings, message)}, |
|
231 'close_form': False} |