src/pyams_content/shared/form/zmi/field.py
changeset 1386 6ea367aeb03c
parent 1343 530cbb970243
child 1429 9b93fdd5ba30
equal deleted inserted replaced
1385:7383e6ce5411 1386:6ea367aeb03c
    23 
    23 
    24 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION
    24 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION
    25 from pyams_content.shared.common.interfaces import IWfSharedContent
    25 from pyams_content.shared.common.interfaces import IWfSharedContent
    26 from pyams_content.shared.common.zmi import WfModifiedContentColumnMixin
    26 from pyams_content.shared.common.zmi import WfModifiedContentColumnMixin
    27 from pyams_content.shared.form.field import FormField
    27 from pyams_content.shared.form.field import FormField
    28 from pyams_content.shared.form.interfaces import IFormField, IFormFieldContainer, IFormFieldContainerTarget, \
    28 from pyams_content.shared.form.interfaces import IFormField, IFormFieldContainer, \
    29     IFormFieldFactory
    29     IFormFieldContainerTarget, IFormFieldFactory
    30 from pyams_content.zmi import pyams_content
    30 from pyams_content.zmi import pyams_content
    31 from pyams_form.form import AJAXAddForm, ajax_config
    31 from pyams_form.form import AJAXAddForm, ajax_config
    32 from pyams_form.interfaces.form import IFormSecurityContext
    32 from pyams_form.interfaces.form import IFormSecurityContext
    33 from pyams_form.security import ProtectedFormObjectMixin
    33 from pyams_form.security import ProtectedFormObjectMixin
    34 from pyams_i18n.interfaces import II18n
    34 from pyams_i18n.interfaces import II18n
    36 from pyams_skin.container import switch_element_visibility
    36 from pyams_skin.container import switch_element_visibility
    37 from pyams_skin.event import get_json_table_row_refresh_event
    37 from pyams_skin.event import get_json_table_row_refresh_event
    38 from pyams_skin.interfaces.container import ITableWithActions
    38 from pyams_skin.interfaces.container import ITableWithActions
    39 from pyams_skin.interfaces.viewlet import IWidgetTitleViewletManager
    39 from pyams_skin.interfaces.viewlet import IWidgetTitleViewletManager
    40 from pyams_skin.layer import IPyAMSLayer
    40 from pyams_skin.layer import IPyAMSLayer
    41 from pyams_skin.table import BaseTable, I18nColumn, I18nValueColumn, SorterColumn, TrashColumn, VisibilitySwitcherColumn
    41 from pyams_skin.table import BaseTable, I18nColumn, I18nValueColumn, SorterColumn, TrashColumn, \
       
    42     VisibilitySwitcherColumn
    42 from pyams_skin.viewlet.menu import MenuItem
    43 from pyams_skin.viewlet.menu import MenuItem
    43 from pyams_skin.viewlet.toolbar import ToolbarAction
    44 from pyams_skin.viewlet.toolbar import ToolbarAction
    44 from pyams_utils.adapter import ContextRequestViewAdapter, adapter_config
    45 from pyams_utils.adapter import ContextRequestViewAdapter, adapter_config
    45 from pyams_utils.fanstatic import get_resource_path
    46 from pyams_utils.fanstatic import get_resource_path
    46 from pyams_utils.interfaces import VIEW_SYSTEM_PERMISSION
    47 from pyams_utils.interfaces import VIEW_SYSTEM_PERMISSION
   120             translate = self.request.localizer.translate
   121             translate = self.request.localizer.translate
   121             return translate(_("No currently defined form field."))
   122             return translate(_("No currently defined form field."))
   122         return super(FormFieldsContainerTable, self).render()
   123         return super(FormFieldsContainerTable, self).render()
   123 
   124 
   124 
   125 
   125 @adapter_config(name='sorter', context=(IFormFieldContainerTarget, IPyAMSLayer, FormFieldsContainerTable),
   126 @adapter_config(name='sorter', context=(IFormFieldContainerTarget, IPyAMSLayer,
       
   127                                         FormFieldsContainerTable),
   126                 provides=IColumn)
   128                 provides=IColumn)
   127 class FormFieldsContainerSorterColumn(ProtectedFormObjectMixin, SorterColumn):
   129 class FormFieldsContainerSorterColumn(ProtectedFormObjectMixin, SorterColumn):
   128     """Form fields container sorter column"""
   130     """Form fields container sorter column"""
   129 
   131 
   130 
   132 
   131 @adapter_config(name='show-hide', context=(IFormFieldContainerTarget, IPyAMSLayer, FormFieldsContainerTable),
   133 @adapter_config(name='show-hide', context=(IFormFieldContainerTarget, IPyAMSLayer,
       
   134                                            FormFieldsContainerTable),
   132                 provides=IColumn)
   135                 provides=IColumn)
   133 class FormFieldsContainerShowHideColumn(ProtectedFormObjectMixin, VisibilitySwitcherColumn):
   136 class FormFieldsContainerShowHideColumn(ProtectedFormObjectMixin, VisibilitySwitcherColumn):
   134     """Form fields container visibility switcher column"""
   137     """Form fields container visibility switcher column"""
   135 
   138 
   136 
   139 
   137 @view_config(name='switch-form-field-visibility.json', context=IFormFieldContainer, request_type=IPyAMSLayer,
   140 @view_config(name='switch-form-field-visibility.json', context=IFormFieldContainer,
   138              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
   141              request_type=IPyAMSLayer, permission=MANAGE_CONTENT_PERMISSION,
       
   142              renderer='json', xhr=True)
   139 def switch_form_field_visibility(request):
   143 def switch_form_field_visibility(request):
   140     """Set form field visibility"""
   144     """Set form field visibility"""
   141     return switch_element_visibility(request, IFormFieldContainer)
   145     return switch_element_visibility(request, IFormFieldContainer)
   142 
   146 
   143 
   147 
   145 def show_hide_column_security_context_factory(column):
   149 def show_hide_column_security_context_factory(column):
   146     """Show/hide column security context factory"""
   150     """Show/hide column security context factory"""
   147     return column.table.context
   151     return column.table.context
   148 
   152 
   149 
   153 
   150 @adapter_config(name='name', context=(IFormFieldContainerTarget, IPyAMSLayer, FormFieldsContainerTable),
   154 @adapter_config(name='name', context=(IFormFieldContainerTarget, IPyAMSLayer,
       
   155                                       FormFieldsContainerTable),
   151                 provides=IColumn)
   156                 provides=IColumn)
   152 class FormFieldsContainerNameColumn(I18nColumn, WfModifiedContentColumnMixin, GetAttrColumn):
   157 class FormFieldsContainerNameColumn(I18nColumn, WfModifiedContentColumnMixin, GetAttrColumn):
   153     """Form fields container name column"""
   158     """Form fields container name column"""
   154 
   159 
   155     _header = _("Name")
   160     _header = _("Name")
   156 
   161 
   157     attrName = 'name'
   162     attrName = 'name'
   158     weight = 50
   163     weight = 50
   159 
   164 
   160 
   165 
   161 @adapter_config(name='label', context=(IFormFieldContainerTarget, IPyAMSLayer, FormFieldsContainerTable),
   166 @adapter_config(name='label', context=(IFormFieldContainerTarget, IPyAMSLayer,
       
   167                                        FormFieldsContainerTable),
   162                 provides=IColumn)
   168                 provides=IColumn)
   163 class FormFieldsContainerLabelColumn(I18nColumn, WfModifiedContentColumnMixin, I18nValueColumn):
   169 class FormFieldsContainerLabelColumn(I18nColumn, WfModifiedContentColumnMixin, I18nValueColumn):
   164     """Form fields container label column"""
   170     """Form fields container label column"""
   165 
   171 
   166     _header = _("Label")
   172     _header = _("Label")
   167 
   173 
   168     attrName = 'label'
   174     attrName = 'label'
   169     weight = 55
   175     weight = 55
   170 
   176 
   171 
   177 
   172 @adapter_config(name='type', context=(IFormFieldContainerTarget, IPyAMSLayer, FormFieldsContainerTable),
   178 @adapter_config(name='type', context=(IFormFieldContainerTarget, IPyAMSLayer,
       
   179                                       FormFieldsContainerTable),
   173                 provides=IColumn)
   180                 provides=IColumn)
   174 class FormFieldsContainerTypeColumn(I18nColumn, WfModifiedContentColumnMixin, GetAttrColumn):
   181 class FormFieldsContainerTypeColumn(I18nColumn, WfModifiedContentColumnMixin, GetAttrColumn):
   175     """Form fields container label column"""
   182     """Form fields container label column"""
   176 
   183 
   177     _header = _("Field type")
   184     _header = _("Field type")
   185         else:
   192         else:
   186             label = _("-- unknown field type --")
   193             label = _("-- unknown field type --")
   187         return self.request.localizer.translate(label)
   194         return self.request.localizer.translate(label)
   188 
   195 
   189 
   196 
   190 @adapter_config(name='trash', context=(IFormFieldContainerTarget, IPyAMSLayer, FormFieldsContainerTable),
   197 @adapter_config(name='trash', context=(IFormFieldContainerTarget, IPyAMSLayer,
       
   198                                        FormFieldsContainerTable),
   191                 provides=IColumn)
   199                 provides=IColumn)
   192 class FormFieldsContainerTrashColumn(ProtectedFormObjectMixin, TrashColumn):
   200 class FormFieldsContainerTrashColumn(ProtectedFormObjectMixin, TrashColumn):
   193     """Form fields container trash column"""
   201     """Form fields container trash column"""
   194 
   202 
   195 
   203 
   196 @adapter_config(context=(IFormFieldContainerTarget, IPyAMSLayer, FormFieldsContainerTable), provides=IValues)
   204 @adapter_config(context=(IFormFieldContainerTarget, IPyAMSLayer, FormFieldsContainerTable),
       
   205                 provides=IValues)
   197 class FormFieldsContainerValues(ContextRequestViewAdapter):
   206 class FormFieldsContainerValues(ContextRequestViewAdapter):
   198     """Form fields container values"""
   207     """Form fields container values"""
   199 
   208 
   200     @property
   209     @property
   201     def values(self):
   210     def values(self):
   209 
   218 
   210     title = _("Form fields list")
   219     title = _("Form fields list")
   211     table_class = FormFieldsContainerTable
   220     table_class = FormFieldsContainerTable
   212 
   221 
   213 
   222 
   214 @view_config(name='set-form-fields-order.json', context=IFormFieldContainer, request_type=IPyAMSLayer,
   223 @view_config(name='set-form-fields-order.json', context=IFormFieldContainer,
   215              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
   224              request_type=IPyAMSLayer, permission=MANAGE_CONTENT_PERMISSION,
       
   225              renderer='json', xhr=True)
   216 def set_form_fields_order(request):
   226 def set_form_fields_order(request):
   217     """Update form fields order"""
   227     """Update form fields order"""
   218     order = list(map(str, json.loads(request.params.get('names'))))
   228     order = list(map(str, json.loads(request.params.get('names'))))
   219     request.context.updateOrder(order)
   229     request.context.updateOrder(order)
   220     return {'status': 'success'}
   230     return {'status': 'success'}
   267     if name in container:
   277     if name in container:
   268         event.form.widgets.errors += (Invalid(_("Specified name is already used!")),)
   278         event.form.widgets.errors += (Invalid(_("Specified name is already used!")),)
   269     event.data['name'] = name
   279     event.data['name'] = name
   270 
   280 
   271 
   281 
   272 @pagelet_config(name='properties.html', context=IFormField, layer=IPyAMSLayer, permission=MANAGE_CONTENT_PERMISSION)
   282 @pagelet_config(name='properties.html', context=IFormField, layer=IPyAMSLayer,
       
   283                 permission=VIEW_SYSTEM_PERMISSION)
   273 @ajax_config(name='properties.json', context=IFormField, layer=IPyAMSLayer)
   284 @ajax_config(name='properties.json', context=IFormField, layer=IPyAMSLayer)
   274 class FormFieldPropertiesEditForm(AdminDialogEditForm):
   285 class FormFieldPropertiesEditForm(AdminDialogEditForm):
   275     """Form field properties edit form"""
   286     """Form field properties edit form"""
   276 
   287 
   277     prefix = 'field_properties.'
   288     prefix = 'field_properties.'
   295     def get_ajax_output(self, changes):
   306     def get_ajax_output(self, changes):
   296         output = super(self.__class__, self).get_ajax_output(changes)
   307         output = super(self.__class__, self).get_ajax_output(changes)
   297         if changes:
   308         if changes:
   298             container = get_parent(self.context, IFormFieldContainerTarget)
   309             container = get_parent(self.context, IFormFieldContainerTarget)
   299             output.setdefault('events', []).append(
   310             output.setdefault('events', []).append(
   300                 get_json_table_row_refresh_event(container, self.request, FormFieldsContainerTable, self.context))
   311                 get_json_table_row_refresh_event(container, self.request,
       
   312                                                  FormFieldsContainerTable, self.context))
   301         return output
   313         return output