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' |