src/pyams_utils/zmi/zeo.py
changeset 60 cde349864894
parent 50 f4e90f45ebb3
child 147 f9160b38922c
equal deleted inserted replaced
59:351dab28bb15 60:cde349864894
    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}