src/pyams_content/shared/common/zmi/types.py
changeset 591 b694d5667d17
parent 527 5dd1aa8bedd9
child 634 4e43b556a2a9
equal deleted inserted replaced
590:4fafaf94701d 591:b694d5667d17
    31 from z3c.form.interfaces import DISPLAY_MODE, IDataExtractedEvent
    31 from z3c.form.interfaces import DISPLAY_MODE, IDataExtractedEvent
    32 from z3c.table.interfaces import IValues, IColumn
    32 from z3c.table.interfaces import IValues, IColumn
    33 
    33 
    34 # import packages
    34 # import packages
    35 from pyams_content.shared.common.types import DataType, SubType
    35 from pyams_content.shared.common.types import DataType, SubType
    36 from pyams_form.form import AJAXAddForm, AJAXEditForm
    36 from pyams_form.form import AJAXAddForm, ajax_config
    37 from pyams_form.security import ProtectedFormObjectMixin
    37 from pyams_form.security import ProtectedFormObjectMixin
    38 from pyams_pagelet.pagelet import pagelet_config
    38 from pyams_pagelet.pagelet import pagelet_config
    39 from pyams_skin.container import delete_container_element
    39 from pyams_skin.container import delete_container_element
    40 from pyams_skin.event import get_json_table_refresh_event
    40 from pyams_skin.event import get_json_table_refresh_event
    41 from pyams_skin.table import BaseTable, SorterColumn, TrashColumn, NameColumn, ActionColumn
    41 from pyams_skin.table import BaseTable, SorterColumn, TrashColumn, NameColumn, ActionColumn
   237     modal_target = True
   237     modal_target = True
   238 
   238 
   239 
   239 
   240 @pagelet_config(name='add-data-type.html', context=ITypedSharedTool, layer=IPyAMSLayer,
   240 @pagelet_config(name='add-data-type.html', context=ITypedSharedTool, layer=IPyAMSLayer,
   241                 permission=MANAGE_TOOL_PERMISSION)
   241                 permission=MANAGE_TOOL_PERMISSION)
       
   242 @ajax_config(name='add-data-type.json', context=ITypedSharedTool, layer=IPyAMSLayer, base=AJAXAddForm)
   242 class DataTypeAddForm(AdminDialogAddForm):
   243 class DataTypeAddForm(AdminDialogAddForm):
   243     """Data type add form"""
   244     """Data type add form"""
   244 
   245 
   245     legend = _("Add new data type")
   246     legend = _("Add new data type")
   246     icon_css_class = 'fa fa-fw fa-folder-o'
   247     icon_css_class = 'fa fa-fw fa-folder-o'
   247     label_css_class = 'control-label col-md-4'
   248     label_css_class = 'control-label col-md-4'
   248     input_css_class = 'col-md-8'
   249     input_css_class = 'col-md-8'
   249 
   250 
   250     fields = field.Fields(IDataType).omit('__parent__', '__name__')
   251     fields = field.Fields(IDataType).omit('__parent__', '__name__')
   251 
   252 
   252     ajax_handler = 'add-data-type.json'
       
   253     edit_permission = MANAGE_TOOL_PERMISSION
   253     edit_permission = MANAGE_TOOL_PERMISSION
   254 
   254 
   255     def create(self, data):
   255     def create(self, data):
   256         return DataType()
   256         return DataType()
   257 
   257 
   258     def add(self, object):
   258     def add(self, object):
   259         name = translate_string(object.name, spaces='-')
   259         name = translate_string(object.name, spaces='-')
   260         ITypedDataManager(self.context)[name] = object
   260         ITypedDataManager(self.context)[name] = object
   261 
   261 
   262     def nextURL(self):
   262     def nextURL(self):
   263         return absolute_url(self.context, self.request, 'admin#data-types.html')
   263         return '#data-types.html'
   264 
   264 
   265 
   265 
   266 @subscriber(IDataExtractedEvent, form_selector=DataTypeAddForm)
   266 @subscriber(IDataExtractedEvent, form_selector=DataTypeAddForm)
   267 def handle_datatype_add_form_data_extraction(event):
   267 def handle_datatype_add_form_data_extraction(event):
   268     """Check new data type for existing name"""
   268     """Check new data type for existing name"""
   271     name = event.data.get('name')
   271     name = event.data.get('name')
   272     if translate_string(name, spaces='-') in manager:
   272     if translate_string(name, spaces='-') in manager:
   273         event.form.widgets.errors += (Invalid(_("Specified type name is already used!")),)
   273         event.form.widgets.errors += (Invalid(_("Specified type name is already used!")),)
   274 
   274 
   275 
   275 
   276 @view_config(name='add-data-type.json', context=ITypedSharedTool, request_type=IPyAMSLayer,
       
   277              permission=MANAGE_TOOL_PERMISSION, renderer='json', xhr=True)
       
   278 class DataTypeAJAXAddForm(AJAXAddForm, DataTypeAddForm):
       
   279     """Data type add form, JSON renderer"""
       
   280 
       
   281     def nextURL(self):
       
   282         return '#data-types.html'
       
   283 
       
   284 
       
   285 @pagelet_config(name='properties.html', context=IDataType, layer=IPyAMSLayer, permission=MANAGE_TOOL_PERMISSION)
   276 @pagelet_config(name='properties.html', context=IDataType, layer=IPyAMSLayer, permission=MANAGE_TOOL_PERMISSION)
       
   277 @ajax_config(name='properties.json', context=IDataType, layer=IPyAMSLayer)
   286 class DataTypeEditForm(AdminDialogEditForm):
   278 class DataTypeEditForm(AdminDialogEditForm):
   287     """Data type edit form"""
   279     """Data type edit form"""
   288 
   280 
   289     prefix = 'datatype_properties.'
   281     prefix = 'datatype_properties.'
   290 
   282 
   293     label_css_class = 'control-label col-md-4'
   285     label_css_class = 'control-label col-md-4'
   294     input_css_class = 'col-md-8'
   286     input_css_class = 'col-md-8'
   295 
   287 
   296     fields = field.Fields(IDataType).omit('__parent__', '__name__')
   288     fields = field.Fields(IDataType).omit('__parent__', '__name__')
   297 
   289 
   298     ajax_handler = 'properties.json'
       
   299     edit_permission = MANAGE_TOOL_PERMISSION
   290     edit_permission = MANAGE_TOOL_PERMISSION
   300 
   291 
   301     def updateWidgets(self, prefix=None):
   292     def updateWidgets(self, prefix=None):
   302         super(DataTypeEditForm, self).updateWidgets(prefix)
   293         super(DataTypeEditForm, self).updateWidgets(prefix)
   303         if 'name' in self.widgets:
   294         if 'name' in self.widgets:
   304             self.widgets['name'].mode = DISPLAY_MODE
   295             self.widgets['name'].mode = DISPLAY_MODE
   305 
       
   306 
       
   307 @view_config(name='properties.json', context=IDataType, request_type=IPyAMSLayer,
       
   308              permission=MANAGE_TOOL_PERMISSION, renderer='json', xhr=True)
       
   309 class DataTypeAJAXEditForm(AJAXEditForm, DataTypeEditForm):
       
   310     """Data type edit form, JSON renderer"""
       
   311 
   296 
   312 
   297 
   313 #
   298 #
   314 # Subtypes views
   299 # Subtypes views
   315 #
   300 #
   458     modal_target = True
   443     modal_target = True
   459 
   444 
   460 
   445 
   461 @pagelet_config(name='add-data-subtype.html', context=IDataType, layer=IPyAMSLayer,
   446 @pagelet_config(name='add-data-subtype.html', context=IDataType, layer=IPyAMSLayer,
   462                 permission=MANAGE_TOOL_PERMISSION)
   447                 permission=MANAGE_TOOL_PERMISSION)
       
   448 @ajax_config(name='add-data-subtype.json', context=IDataType, layer=IPyAMSLayer, base=AJAXAddForm)
   463 class DataSubtypeAddForm(AdminDialogAddForm):
   449 class DataSubtypeAddForm(AdminDialogAddForm):
   464     """Data subtype add form"""
   450     """Data subtype add form"""
   465 
   451 
   466     legend = _("Add new subtype")
   452     legend = _("Add new subtype")
   467     icon_css_class = 'fa fa-fw fa-folder-o'
   453     icon_css_class = 'fa fa-fw fa-folder-o'
   468     label_css_class = 'control-label col-md-4'
   454     label_css_class = 'control-label col-md-4'
   469     input_css_class = 'col-md-8'
   455     input_css_class = 'col-md-8'
   470 
   456 
   471     fields = field.Fields(ISubType).omit('__parent__', '__name__')
   457     fields = field.Fields(ISubType).omit('__parent__', '__name__')
   472 
   458 
   473     ajax_handler = 'add-data-subtype.json'
       
   474     edit_permission = MANAGE_TOOL_PERMISSION
   459     edit_permission = MANAGE_TOOL_PERMISSION
   475 
   460 
   476     def create(self, data):
   461     def create(self, data):
   477         return SubType()
   462         return SubType()
   478 
   463 
   480         name = translate_string(object.name, spaces='-')
   465         name = translate_string(object.name, spaces='-')
   481         IDataType(self.context)[name] = object
   466         IDataType(self.context)[name] = object
   482 
   467 
   483     def nextURL(self):
   468     def nextURL(self):
   484         return absolute_url(self.context, self.request, 'admin#data-types.html')
   469         return absolute_url(self.context, self.request, 'admin#data-types.html')
       
   470 
       
   471     def get_ajax_output(self, changes):
       
   472         return {
       
   473             'status': 'success',
       
   474             'message': self.request.localizer.translate(_("Subtype was correctly added.")),
       
   475             'events': [
       
   476                 get_json_table_refresh_event(self.context, self.request, DatatypeSubtypesTable)
       
   477             ]
       
   478         }
   485 
   479 
   486 
   480 
   487 @subscriber(IDataExtractedEvent, form_selector=DataSubtypeAddForm)
   481 @subscriber(IDataExtractedEvent, form_selector=DataSubtypeAddForm)
   488 def handle_subtype_add_form_data_extraction(event):
   482 def handle_subtype_add_form_data_extraction(event):
   489     """Check new data subtype for existing name"""
   483     """Check new data subtype for existing name"""
   492     name = event.data.get('name')
   486     name = event.data.get('name')
   493     if translate_string(name, spaces='-') in manager:
   487     if translate_string(name, spaces='-') in manager:
   494         event.form.widgets.errors += (Invalid(_("Specified subtype name is already used!")),)
   488         event.form.widgets.errors += (Invalid(_("Specified subtype name is already used!")),)
   495 
   489 
   496 
   490 
   497 @view_config(name='add-data-subtype.json', context=IDataType, request_type=IPyAMSLayer,
       
   498              permission=MANAGE_TOOL_PERMISSION, renderer='json', xhr=True)
       
   499 class DataSubtypeAJAXAddForm(AJAXAddForm, DataSubtypeAddForm):
       
   500     """Data subtype add form, JSON renderer"""
       
   501 
       
   502     def get_ajax_output(self, changes):
       
   503         return {
       
   504             'status': 'success',
       
   505             'message': self.request.localizer.translate(_("Subtype was correctly added.")),
       
   506             'events': [
       
   507                 get_json_table_refresh_event(self.context, self.request, DatatypeSubtypesTable)
       
   508             ]
       
   509         }
       
   510 
       
   511 
       
   512 @pagelet_config(name='properties.html', context=ISubType, layer=IPyAMSLayer, permission=MANAGE_TOOL_PERMISSION)
   491 @pagelet_config(name='properties.html', context=ISubType, layer=IPyAMSLayer, permission=MANAGE_TOOL_PERMISSION)
       
   492 @ajax_config(name='properties.json', context=ISubType, layer=IPyAMSLayer)
   513 class DataSubtypeEditForm(AdminDialogEditForm):
   493 class DataSubtypeEditForm(AdminDialogEditForm):
   514     """Data subtype edit form"""
   494     """Data subtype edit form"""
   515 
   495 
   516     prefix = 'subtype_properties.'
   496     prefix = 'subtype_properties.'
   517 
   497 
   520     label_css_class = 'control-label col-md-4'
   500     label_css_class = 'control-label col-md-4'
   521     input_css_class = 'col-md-8'
   501     input_css_class = 'col-md-8'
   522 
   502 
   523     fields = field.Fields(ISubType).omit('__parent__', '__name__')
   503     fields = field.Fields(ISubType).omit('__parent__', '__name__')
   524 
   504 
   525     ajax_handler = 'properties.json'
       
   526     edit_permission = MANAGE_TOOL_PERMISSION
   505     edit_permission = MANAGE_TOOL_PERMISSION
   527 
   506 
   528     def updateWidgets(self, prefix=None):
   507     def updateWidgets(self, prefix=None):
   529         super(DataSubtypeEditForm, self).updateWidgets(prefix)
   508         super(DataSubtypeEditForm, self).updateWidgets(prefix)
   530         if 'name' in self.widgets:
   509         if 'name' in self.widgets:
   531             self.widgets['name'].mode = DISPLAY_MODE
   510             self.widgets['name'].mode = DISPLAY_MODE
   532 
       
   533 
       
   534 @view_config(name='properties.json', context=ISubType, request_type=IPyAMSLayer,
       
   535              permission=MANAGE_TOOL_PERMISSION, renderer='json', xhr=True)
       
   536 class DataSubtypeAJAXEditForm(AJAXEditForm, DataSubtypeEditForm):
       
   537     """Data subtype edit form, JSON renderer"""
       
   538 
   511 
   539     def get_ajax_output(self, changes):
   512     def get_ajax_output(self, changes):
   540         if 'label' in changes.get(IBaseDataType, ()):
   513         if 'label' in changes.get(IBaseDataType, ()):
   541             target = get_parent(self.context, IDataType)
   514             target = get_parent(self.context, IDataType)
   542             return {
   515             return {
   545                 'events': [
   518                 'events': [
   546                     get_json_table_refresh_event(target, self.request, DatatypeSubtypesTable)
   519                     get_json_table_refresh_event(target, self.request, DatatypeSubtypesTable)
   547                 ]
   520                 ]
   548             }
   521             }
   549         else:
   522         else:
   550             return super(DataSubtypeAJAXEditForm, self).get_ajax_output(changes)
   523             return super(self.__class__, self).get_ajax_output(changes)