src/pyams_content/shared/common/zmi/properties.py
changeset 591 b694d5667d17
parent 534 09b34ca38bf1
child 832 54e1fc14724b
equal deleted inserted replaced
590:4fafaf94701d 591:b694d5667d17
     7 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
     7 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
     8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
     9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
    10 # FOR A PARTICULAR PURPOSE.
    10 # FOR A PARTICULAR PURPOSE.
    11 #
    11 #
    12 from pyramid.events import subscriber
       
    13 from z3c.form.interfaces import IDataExtractedEvent, HIDDEN_MODE
       
    14 
       
    15 from pyams_skin.event import get_json_widget_refresh_event
       
    16 from pyams_utils.url import generate_url
       
    17 
    12 
    18 __docformat__ = 'restructuredtext'
    13 __docformat__ = 'restructuredtext'
    19 
    14 
    20 
    15 
    21 # import standard library
    16 # import standard library
    28 from pyams_skin.layer import IPyAMSLayer
    23 from pyams_skin.layer import IPyAMSLayer
    29 from pyams_utils.interfaces import VIEW_SYSTEM_PERMISSION
    24 from pyams_utils.interfaces import VIEW_SYSTEM_PERMISSION
    30 from pyams_zmi.interfaces import IPropertiesEditForm
    25 from pyams_zmi.interfaces import IPropertiesEditForm
    31 from pyams_zmi.interfaces.menu import IContentManagementMenu, IPropertiesMenu
    26 from pyams_zmi.interfaces.menu import IContentManagementMenu, IPropertiesMenu
    32 from pyams_zmi.layer import IAdminLayer
    27 from pyams_zmi.layer import IAdminLayer
       
    28 from z3c.form.interfaces import IDataExtractedEvent, HIDDEN_MODE
    33 
    29 
    34 # import packages
    30 # import packages
    35 from pyams_content.shared.common.zmi import WfSharedContentHeaderAdapter
    31 from pyams_content.shared.common.zmi import WfSharedContentHeaderAdapter
    36 from pyams_form.form import AJAXEditForm
    32 from pyams_form.form import ajax_config
    37 from pyams_i18n.widget import I18nSEOTextLineFieldWidget
    33 from pyams_i18n.widget import I18nSEOTextLineFieldWidget
    38 from pyams_pagelet.pagelet import pagelet_config
    34 from pyams_pagelet.pagelet import pagelet_config
       
    35 from pyams_skin.event import get_json_widget_refresh_event
    39 from pyams_skin.viewlet.menu import MenuItem
    36 from pyams_skin.viewlet.menu import MenuItem
    40 from pyams_utils.adapter import adapter_config
    37 from pyams_utils.adapter import adapter_config
       
    38 from pyams_utils.url import generate_url
    41 from pyams_viewlet.manager import viewletmanager_config
    39 from pyams_viewlet.manager import viewletmanager_config
    42 from pyams_viewlet.viewlet import viewlet_config
    40 from pyams_viewlet.viewlet import viewlet_config
    43 from pyams_zmi.form import AdminEditForm
    41 from pyams_zmi.form import AdminEditForm
    44 from pyramid.view import view_config
    42 from pyramid.events import subscriber
    45 from z3c.form import field
    43 from z3c.form import field
    46 from zope.interface import implementer
    44 from zope.interface import implementer
    47 
    45 
    48 from pyams_content import _
    46 from pyams_content import _
    49 
    47 
    74     url = '#properties.html'
    72     url = '#properties.html'
    75 
    73 
    76 
    74 
    77 @pagelet_config(name='properties.html', context=IWfSharedContent, layer=IPyAMSLayer,
    75 @pagelet_config(name='properties.html', context=IWfSharedContent, layer=IPyAMSLayer,
    78                 permission=MANAGE_CONTENT_PERMISSION)
    76                 permission=MANAGE_CONTENT_PERMISSION)
       
    77 @ajax_config(name='properties.json', context=IWfSharedContent, layer=IPyAMSLayer, permission=MANAGE_CONTENT_PERMISSION)
    79 @implementer(IPropertiesEditForm, IWidgetForm, IInnerPage)
    78 @implementer(IPropertiesEditForm, IWidgetForm, IInnerPage)
    80 class SharedContentPropertiesEditForm(AdminEditForm):
    79 class SharedContentPropertiesEditForm(AdminEditForm):
    81     """Shared content properties edit form"""
    80     """Shared content properties edit form"""
    82 
    81 
    83     legend = _("Content properties")
    82     legend = _("Content properties")
    84 
    83 
    85     fields = field.Fields(IWfSharedContent).select('title', 'short_name', 'content_url',
    84     fields = field.Fields(IWfSharedContent).select('title', 'short_name', 'content_url',
    86                                                    'description', 'notepad')
    85                                                    'description', 'notepad')
    87     fields['title'].widgetFactory = I18nSEOTextLineFieldWidget
    86     fields['title'].widgetFactory = I18nSEOTextLineFieldWidget
    88 
    87 
    89     ajax_handler = 'properties.json'
       
    90 
       
    91     def updateWidgets(self, prefix=None):
    88     def updateWidgets(self, prefix=None):
    92         super(SharedContentPropertiesEditForm, self).updateWidgets(prefix)
    89         super(SharedContentPropertiesEditForm, self).updateWidgets(prefix)
    93         if 'short_name' in self.widgets:
    90         if 'short_name' in self.widgets:
    94             self.widgets['short_name'].set_mode(HIDDEN_MODE)
    91             self.widgets['short_name'].set_mode(HIDDEN_MODE)
    95         if 'description' in self.widgets:
    92         if 'description' in self.widgets:
    96             self.widgets['description'].widget_css_class = 'textarea'
    93             self.widgets['description'].widget_css_class = 'textarea'
    97         if 'notepad' in self.widgets:
    94         if 'notepad' in self.widgets:
    98             self.widgets['notepad'].widget_css_class = 'textarea'
    95             self.widgets['notepad'].widget_css_class = 'textarea'
       
    96 
       
    97     def get_ajax_output(self, changes):
       
    98         updated = changes.get(IBaseContent, ())
       
    99         if 'title' in updated:
       
   100             return {
       
   101                 'status': 'reload',
       
   102                 'message': self.request.localizer.translate(self.successMessage)
       
   103             }
       
   104         else:
       
   105             output = super(self.__class__, self).get_ajax_output(changes)
       
   106             updated = changes.get(IWfSharedContent, ())
       
   107             if 'content_url' in updated:
       
   108                 output.setdefault('events', []).append(
       
   109                     get_json_widget_refresh_event(self.context, self.request,
       
   110                                                   SharedContentPropertiesEditForm, 'content_url'))
       
   111             return output
    99 
   112 
   100 
   113 
   101 @subscriber(IDataExtractedEvent, form_selector=SharedContentPropertiesEditForm)
   114 @subscriber(IDataExtractedEvent, form_selector=SharedContentPropertiesEditForm)
   102 def handle_content_properties_data_extraction(event):
   115 def handle_content_properties_data_extraction(event):
   103     """Automatically set short_name as title"""
   116     """Automatically set short_name as title"""
   104     data = event.data
   117     data = event.data
   105     data['short_name'] = data['title'].copy()
   118     data['short_name'] = data['title'].copy()
   106     data['content_url'] = generate_url(data['content_url'])
   119     data['content_url'] = generate_url(data['content_url'])
   107 
   120 
   108 
   121 
   109 @view_config(name='properties.json', context=IWfSharedContent, request_type=IPyAMSLayer,
       
   110              permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True)
       
   111 class SharedContentPropertiesAJAXEditForm(AJAXEditForm, SharedContentPropertiesEditForm):
       
   112     """Shared content properties edit form, JSON renderer"""
       
   113 
       
   114     def get_ajax_output(self, changes):
       
   115         updated = changes.get(IBaseContent, ())
       
   116         if 'title' in updated:
       
   117             return {
       
   118                 'status': 'reload',
       
   119                 'message': self.request.localizer.translate(self.successMessage)
       
   120             }
       
   121         else:
       
   122             output = super(SharedContentPropertiesAJAXEditForm, self).get_ajax_output(changes)
       
   123             updated = changes.get(IWfSharedContent, ())
       
   124             if 'content_url' in updated:
       
   125                 output.setdefault('events', []).append(
       
   126                     get_json_widget_refresh_event(self.context, self.request,
       
   127                                                   SharedContentPropertiesEditForm, 'content_url'))
       
   128             return output
       
   129 
       
   130 
       
   131 @adapter_config(context=(IWfSharedContent, IAdminLayer, SharedContentPropertiesEditForm), provides=IPageHeader)
   122 @adapter_config(context=(IWfSharedContent, IAdminLayer, SharedContentPropertiesEditForm), provides=IPageHeader)
   132 class SharedContentPropertiesHeaderAdapter(WfSharedContentHeaderAdapter):
   123 class SharedContentPropertiesHeaderAdapter(WfSharedContentHeaderAdapter):
   133     """Shared content properties header adapter"""
   124     """Shared content properties header adapter"""
   134 
   125 
   135     icon_class = 'fa fa-fw fa-edit'
   126     icon_class = 'fa fa-fw fa-edit'