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 |
12 |
13 __docformat__ = 'restructuredtext' |
|
14 |
|
15 from pyramid.decorator import reify |
13 from pyramid.decorator import reify |
16 from pyramid.location import lineage |
14 from pyramid.location import lineage |
17 from z3c.form import button, field |
15 from z3c.form import button, field |
18 from zope.interface import Interface |
16 from zope.interface import Interface |
19 |
17 |
20 from pyams_content.component.paragraph import IParagraphContainer, IParagraphTitle |
18 from pyams_content.component.paragraph import IParagraphContainer, IParagraphTitle |
21 from pyams_content.component.paragraph.interfaces import IBaseParagraph, IParagraphContainerTarget, IParagraphFactory, \ |
19 from pyams_content.component.paragraph.interfaces import IBaseParagraph, IParagraphContainerTarget, \ |
22 IParagraphFactorySettings, IParagraphRenderer, PARAGRAPH_HIDDEN_FIELDS |
20 IParagraphFactory, IParagraphFactorySettings, IParagraphRenderer, PARAGRAPH_HIDDEN_FIELDS |
23 from pyams_content.component.paragraph.zmi.container import ParagraphContainerBaseTable, ParagraphContainerTable |
21 from pyams_content.component.paragraph.zmi.container import ParagraphContainerBaseTable, \ |
|
22 ParagraphContainerTable |
24 from pyams_content.component.paragraph.zmi.interfaces import IParagraphContainerView |
23 from pyams_content.component.paragraph.zmi.interfaces import IParagraphContainerView |
25 from pyams_content.features.renderer.zmi import BaseRenderedContentRenderer |
24 from pyams_content.features.renderer.zmi import BaseRenderedContentRenderer |
26 from pyams_content.features.renderer.zmi.widget import RendererFieldWidget |
25 from pyams_content.features.renderer.zmi.widget import RendererFieldWidget |
27 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION, MANAGE_TOOL_PERMISSION |
26 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION, MANAGE_TOOL_PERMISSION |
28 from pyams_content.shared.common.interfaces import IWfSharedContent |
27 from pyams_content.shared.common.interfaces import IWfSharedContent |
47 from pyams_viewlet.viewlet import viewlet_config |
46 from pyams_viewlet.viewlet import viewlet_config |
48 from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm |
47 from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm |
49 from pyams_zmi.interfaces.menu import IPropertiesMenu |
48 from pyams_zmi.interfaces.menu import IPropertiesMenu |
50 from pyams_zmi.layer import IAdminLayer |
49 from pyams_zmi.layer import IAdminLayer |
51 |
50 |
|
51 |
|
52 __docformat__ = 'restructuredtext' |
|
53 |
52 from pyams_content import _ |
54 from pyams_content import _ |
53 |
55 |
54 |
56 |
55 # |
57 # |
56 # Default paragraphs settings |
58 # Default paragraphs settings |
57 # |
59 # |
58 |
60 |
59 @viewlet_config(name='default-paragraphs.menu', context=IParagraphFactorySettings, layer=IAdminLayer, |
61 @viewlet_config(name='default-paragraphs.menu', context=IParagraphFactorySettings, |
60 manager=IPropertiesMenu, permission=MANAGE_TOOL_PERMISSION, weight=10) |
62 layer=IAdminLayer, manager=IPropertiesMenu, permission=MANAGE_TOOL_PERMISSION, |
|
63 weight=10) |
61 class DefaultParagraphsSettingsMenu(MenuItem): |
64 class DefaultParagraphsSettingsMenu(MenuItem): |
62 """Default paragraphs settings menu""" |
65 """Default paragraphs settings menu""" |
63 |
66 |
64 label = _("Content block types...") |
67 label = _("Content block types...") |
65 icon_class = 'fa-paragraph' |
68 icon_class = 'fa-paragraph' |
66 url = 'default-paragraphs.html' |
69 url = 'default-paragraphs.html' |
67 modal_target = True |
70 modal_target = True |
68 |
71 |
69 |
72 |
70 @pagelet_config(name='default-paragraphs.html', context=IParagraphFactorySettings, layer=IPyAMSLayer, |
73 @pagelet_config(name='default-paragraphs.html', context=IParagraphFactorySettings, |
71 permission=MANAGE_TOOL_PERMISSION) |
74 layer=IPyAMSLayer, permission=MANAGE_TOOL_PERMISSION) |
72 @ajax_config(name='default-paragraphs.json', context=IParagraphFactorySettings, layer=IPyAMSLayer) |
75 @ajax_config(name='default-paragraphs.json', context=IParagraphFactorySettings, layer=IPyAMSLayer) |
73 class DefaultParagraphsEditForm(AdminDialogEditForm): |
76 class DefaultParagraphsEditForm(AdminDialogEditForm): |
74 """Default paragraphs edit form""" |
77 """Default paragraphs edit form""" |
75 |
78 |
76 prefix = 'default_paragraphs.' |
79 prefix = 'default_paragraphs.' |
79 |
82 |
80 fields = field.Fields(IParagraphFactorySettings) |
83 fields = field.Fields(IParagraphFactorySettings) |
81 edit_permission = MANAGE_TOOL_PERMISSION |
84 edit_permission = MANAGE_TOOL_PERMISSION |
82 |
85 |
83 |
86 |
84 @adapter_config(context=(IParagraphFactorySettings, IPyAMSLayer, DefaultParagraphsEditForm), provides=IFormHelp) |
87 @adapter_config(context=(IParagraphFactorySettings, IPyAMSLayer, DefaultParagraphsEditForm), |
|
88 provides=IFormHelp) |
85 class DefaultParagraphsEditFormHelp(FormHelp): |
89 class DefaultParagraphsEditFormHelp(FormHelp): |
86 """Default paragraphs edit form help""" |
90 """Default paragraphs edit form help""" |
87 |
91 |
88 message = _("You can define which types of paragraphs are allowed in this container.\n\n" |
92 message = _("You can define which types of paragraphs are allowed in this container.\n\n" |
89 "Default paragraphs will be added automatically (in selected order) to any new created content.\n\n" |
93 "Default paragraphs will be added automatically (in selected order) to any new " |
90 "NOTICE: removing types from allowed types list will have no effect on already created contents!") |
94 "created content.\n\n" |
|
95 "NOTICE: removing types from allowed types list will have no effect on already " |
|
96 "created contents!") |
91 message_format = 'rest' |
97 message_format = 'rest' |
92 |
98 |
93 |
99 |
94 # |
100 # |
95 # Base paragraph forms |
101 # Base paragraph forms |
113 'visible': context.visible |
119 'visible': context.visible |
114 } |
120 } |
115 } |
121 } |
116 |
122 |
117 |
123 |
118 def get_json_paragraph_toolbar_refresh_event(context, request, table_factory=None, viewlet_factory=None): |
124 def get_json_paragraph_toolbar_refresh_event(context, request, table_factory=None, |
|
125 viewlet_factory=None): |
119 """Get JSON response value for paragraph toolbar refresh event""" |
126 """Get JSON response value for paragraph toolbar refresh event""" |
120 if table_factory is None: |
127 if table_factory is None: |
121 from pyams_content.component.paragraph.zmi.container \ |
128 from pyams_content.component.paragraph.zmi.container \ |
122 import ParagraphContainerTable as table_factory |
129 import ParagraphContainerTable as table_factory |
123 if viewlet_factory is None: |
130 if viewlet_factory is None: |
137 'toolbar_tag': viewlet.render() |
144 'toolbar_tag': viewlet.render() |
138 } |
145 } |
139 } |
146 } |
140 |
147 |
141 |
148 |
142 def get_json_paragraph_markers_refresh_event(context, request, form, viewlet_factory, marker_type=None): |
149 def get_json_paragraph_markers_refresh_event(context, request, form, viewlet_factory, |
|
150 marker_type=None): |
143 """Get JSON response value for paragraph markers refresh event""" |
151 """Get JSON response value for paragraph markers refresh event""" |
144 parent = get_parent(context, IParagraphContainerTarget) |
152 parent = get_parent(context, IParagraphContainerTarget) |
145 if parent is not None: |
153 if parent is not None: |
146 marker = viewlet_factory(context, request, form, None) |
154 marker = viewlet_factory(context, request, form, None) |
147 if marker is not None: |
155 if marker is not None: |
163 paragraph_type = None |
171 paragraph_type = None |
164 modal_target = True |
172 modal_target = True |
165 |
173 |
166 def __new__(cls, context, request, view, manager): |
174 def __new__(cls, context, request, view, manager): |
167 settings = get_parent(context, IParagraphFactorySettings) |
175 settings = get_parent(context, IParagraphFactorySettings) |
168 if (settings is not None) and (cls.paragraph_type not in (settings.allowed_paragraphs or ())): |
176 if (settings is not None) and ( |
|
177 cls.paragraph_type not in (settings.allowed_paragraphs or ())): |
169 return None |
178 return None |
170 return ToolbarMenuItem.__new__(cls) |
179 return ToolbarMenuItem.__new__(cls) |
171 |
180 |
172 |
181 |
173 @viewlet_config(name='custom-paragraphs.divider', context=IParagraphContainerTarget, view=IParagraphContainerView, |
182 @viewlet_config(name='custom-paragraphs.divider', context=IParagraphContainerTarget, |
174 layer=IPyAMSLayer, manager=IToolbarAddingMenu, weight=500) |
183 view=IParagraphContainerView, layer=IPyAMSLayer, manager=IToolbarAddingMenu, |
|
184 weight=500) |
175 class ParagraphsAddMenuDivider(ProtectedFormObjectMixin, MenuDivider): |
185 class ParagraphsAddMenuDivider(ProtectedFormObjectMixin, MenuDivider): |
176 """Paragraphs add menu divider""" |
186 """Paragraphs add menu divider""" |
177 |
187 |
178 def __new__(cls, context, request, view, manager): |
188 def __new__(cls, context, request, view, manager): |
179 settings = get_parent(context, IParagraphFactorySettings) |
189 settings = get_parent(context, IParagraphFactorySettings) |
315 get_json_paragraph_refresh_event(self.context, self.request)) |
325 get_json_paragraph_refresh_event(self.context, self.request)) |
316 elif 'renderer' in self.widgets: |
326 elif 'renderer' in self.widgets: |
317 renderer_interface = self.widgets['renderer'].field.interface |
327 renderer_interface = self.widgets['renderer'].field.interface |
318 if 'renderer' in changes.get(renderer_interface, ()): |
328 if 'renderer' in changes.get(renderer_interface, ()): |
319 output.setdefault('events', []).append( |
329 output.setdefault('events', []).append( |
320 get_json_widget_refresh_event(self.context, self.request, self.__class__, 'renderer')) |
330 get_json_widget_refresh_event(self.context, self.request, self.__class__, |
|
331 'renderer')) |
321 renderer = self.context.get_renderer(self.request) |
332 renderer = self.context.get_renderer(self.request) |
322 if (renderer is not None) and \ |
333 if (renderer is not None) and \ |
323 (renderer.settings_interface is not None): |
334 (renderer.settings_interface is not None): |
324 output['smallbox'] = { |
335 output['smallbox'] = { |
325 'status': 'info', |
336 'status': 'info', |
326 'message': self.request.localizer.translate(_("You changed renderer selection. Don't omit to " |
337 'message': self.request.localizer.translate( |
327 "update new renderer properties...")), |
338 _("You changed renderer selection. Don't omit to " |
|
339 "update new renderer properties...")), |
328 'timeout': 5000 |
340 'timeout': 5000 |
329 } |
341 } |
330 return output |
342 return output |
331 |
343 |
332 |
344 |