19 from pyams_content.component.association.interfaces import IAssociationTarget |
19 from pyams_content.component.association.interfaces import IAssociationTarget |
20 from pyams_content.component.association.zmi.interfaces import IAssociationsParentForm |
20 from pyams_content.component.association.zmi.interfaces import IAssociationsParentForm |
21 from pyams_content.component.illustration.interfaces import IIllustration, IIllustrationRenderer |
21 from pyams_content.component.illustration.interfaces import IIllustration, IIllustrationRenderer |
22 from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphContainer, \ |
22 from pyams_content.component.paragraph.interfaces import IParagraphContainerTarget, IParagraphContainer, \ |
23 IParagraphSummary |
23 IParagraphSummary |
24 from pyams_content.component.paragraph.interfaces.html import IHTMLParagraph |
24 from pyams_content.component.paragraph.interfaces.html import IHTMLParagraph, IRawParagraph |
25 from pyams_content.component.paragraph.zmi.interfaces import IParagraphInnerEditor, IParagraphContainerView |
25 from pyams_content.component.paragraph.zmi.interfaces import IParagraphInnerEditor, IParagraphContainerView |
26 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION |
26 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION |
27 from pyams_content.shared.common.interfaces import IWfSharedContent |
|
28 from pyams_form.interfaces.form import IInnerForm, IEditFormButtons |
27 from pyams_form.interfaces.form import IInnerForm, IEditFormButtons |
29 from pyams_i18n.interfaces import II18n |
28 from pyams_i18n.interfaces import II18n |
30 from pyams_skin.interfaces.viewlet import IToolbarAddingMenu |
29 from pyams_skin.interfaces.viewlet import IToolbarAddingMenu |
31 from pyams_skin.layer import IPyAMSLayer |
30 from pyams_skin.layer import IPyAMSLayer |
32 from pyams_zmi.interfaces import IPropertiesEditForm |
31 from pyams_zmi.interfaces import IPropertiesEditForm |
33 from z3c.form.interfaces import INPUT_MODE |
32 from z3c.form.interfaces import INPUT_MODE |
34 |
33 |
35 # import packages |
34 # import packages |
36 from pyams_content.component.association.zmi import AssociationsTable |
35 from pyams_content.component.association.zmi import AssociationsTable |
37 from pyams_content.component.paragraph.html import HTMLParagraph |
36 from pyams_content.component.paragraph.html import HTMLParagraph, RawParagraph |
38 from pyams_content.component.paragraph.zmi import BaseParagraphAJAXAddForm, BaseParagraphAJAXEditForm, \ |
37 from pyams_content.component.paragraph.zmi import BaseParagraphAJAXAddForm, BaseParagraphAJAXEditForm, \ |
39 BaseParagraphAddMenu, BaseParagraphPropertiesEditForm |
38 BaseParagraphAddMenu, BaseParagraphPropertiesEditForm |
40 from pyams_content.component.paragraph.zmi.container import ParagraphContainerTable, \ |
39 from pyams_content.component.paragraph.zmi.container import ParagraphContainerTable, \ |
41 ParagraphTitleToolbarViewletManager |
40 ParagraphTitleToolbarViewletManager |
42 from pyams_pagelet.pagelet import pagelet_config |
41 from pyams_pagelet.pagelet import pagelet_config |
43 from pyams_template.template import template_config |
42 from pyams_template.template import template_config |
44 |
|
45 from pyams_utils.adapter import adapter_config |
43 from pyams_utils.adapter import adapter_config |
46 from pyams_utils.traversing import get_parent |
44 from pyams_utils.traversing import get_parent |
47 from pyams_viewlet.viewlet import viewlet_config, BaseContentProvider |
45 from pyams_viewlet.viewlet import viewlet_config, BaseContentProvider |
48 from pyams_zmi.form import AdminDialogAddForm |
46 from pyams_zmi.form import AdminDialogAddForm |
49 from pyramid.threadlocal import get_current_registry |
47 from pyramid.threadlocal import get_current_registry |
53 |
51 |
54 from pyams_content import _ |
52 from pyams_content import _ |
55 |
53 |
56 |
54 |
57 # |
55 # |
58 # HTML paragraph |
56 # Raw HTML paragraph |
|
57 # |
|
58 |
|
59 @viewlet_config(name='add-raw-paragraph.menu', context=IParagraphContainerTarget, view=IParagraphContainerView, |
|
60 layer=IPyAMSLayer, manager=IToolbarAddingMenu, weight=999) |
|
61 class RawParagraphAddMenu(BaseParagraphAddMenu): |
|
62 """Raw HTML paragraph add menu""" |
|
63 |
|
64 label = _("Add raw HTML paragraph...") |
|
65 label_css_class = 'fa fa-fw fa-code' |
|
66 url = 'add-raw-paragraph.html' |
|
67 paragraph_type = 'raw' |
|
68 |
|
69 |
|
70 @pagelet_config(name='add-raw-paragraph.html', context=IParagraphContainerTarget, layer=IPyAMSLayer, |
|
71 permission=MANAGE_CONTENT_PERMISSION) |
|
72 class RawParagraphAddForm(AdminDialogAddForm): |
|
73 """Raw HTML paragraph add form""" |
|
74 |
|
75 legend = _("Add new raw HTML paragraph") |
|
76 dialog_class = 'modal-large' |
|
77 icon_css_class = 'fa fa-fw fa-code' |
|
78 label_css_class = 'control-label col-md-2' |
|
79 input_css_class = 'col-md-10' |
|
80 |
|
81 fields = field.Fields(IRawParagraph).omit('__parent__', '__name__', 'visible') |
|
82 ajax_handler = 'add-raw-paragraph.json' |
|
83 edit_permission = MANAGE_CONTENT_PERMISSION |
|
84 |
|
85 def updateWidgets(self, prefix=None): |
|
86 super(RawParagraphAddForm, self).updateWidgets(prefix) |
|
87 if 'body' in self.widgets: |
|
88 self.widgets['body'].widget_css_class = 'textarea height-100' |
|
89 |
|
90 def create(self, data): |
|
91 return RawParagraph() |
|
92 |
|
93 def add(self, object): |
|
94 IParagraphContainer(self.context).append(object) |
|
95 |
|
96 |
|
97 @view_config(name='add-raw-paragraph.json', context=IParagraphContainerTarget, request_type=IPyAMSLayer, |
|
98 permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True) |
|
99 class RawParagraphAJAXAddForm(BaseParagraphAJAXAddForm, RawParagraphAddForm): |
|
100 """Raw HTML paragraph add form, JSON renderer""" |
|
101 |
|
102 |
|
103 @pagelet_config(name='properties.html', context=IRawParagraph, layer=IPyAMSLayer, |
|
104 permission=MANAGE_CONTENT_PERMISSION) |
|
105 class RawParagraphPropertiesEditForm(BaseParagraphPropertiesEditForm): |
|
106 """Raw HTML paragraph properties edit form""" |
|
107 |
|
108 legend = _("Edit raw HTML paragraph properties") |
|
109 icon_css_class = 'fa fa-fw fa-code' |
|
110 |
|
111 fields = field.Fields(IRawParagraph).omit('__parent__', '__name__', 'visible') |
|
112 ajax_handler = 'properties.json' |
|
113 edit_permission = MANAGE_CONTENT_PERMISSION |
|
114 |
|
115 def updateWidgets(self, prefix=None): |
|
116 super(RawParagraphPropertiesEditForm, self).updateWidgets(prefix) |
|
117 if 'body' in self.widgets: |
|
118 self.widgets['body'].widget_css_class = 'textarea height-100' |
|
119 |
|
120 |
|
121 @view_config(name='properties.json', context=IRawParagraph, request_type=IPyAMSLayer, |
|
122 permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True) |
|
123 class RawParagraphPropertiesAJAXEditForm(BaseParagraphAJAXEditForm, RawParagraphPropertiesEditForm): |
|
124 """Raw HTML paragraph properties edit form, JSON renderer""" |
|
125 |
|
126 |
|
127 @adapter_config(context=(IRawParagraph, IPyAMSLayer), provides=IParagraphInnerEditor) |
|
128 @implementer(IInnerForm) |
|
129 class RawParagraphInnerEditForm(RawParagraphPropertiesEditForm): |
|
130 """Raw HTML paragraph inner edit form""" |
|
131 |
|
132 legend = None |
|
133 ajax_handler = 'inner-properties.json' |
|
134 |
|
135 @property |
|
136 def buttons(self): |
|
137 if self.mode == INPUT_MODE: |
|
138 return button.Buttons(IEditFormButtons) |
|
139 else: |
|
140 return button.Buttons() |
|
141 |
|
142 |
|
143 @view_config(name='inner-properties.json', context=IRawParagraph, request_type=IPyAMSLayer, |
|
144 permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True) |
|
145 class RawParagraphInnerAJAXEditForm(BaseParagraphAJAXEditForm, RawParagraphInnerEditForm): |
|
146 """Raw HTML paragraph inner edit form, JSON renderer""" |
|
147 |
|
148 |
|
149 # |
|
150 # Raw HTML paragraph summary |
|
151 # |
|
152 |
|
153 @adapter_config(context=(IRawParagraph, IPyAMSLayer), provides=IParagraphSummary) |
|
154 @template_config(template='templates/raw-summary.pt', layer=IPyAMSLayer) |
|
155 class RawParagraphSummary(BaseContentProvider): |
|
156 """Raw HTML paragraph summary""" |
|
157 |
|
158 language = None |
|
159 |
|
160 def update(self): |
|
161 i18n = II18n(self.context) |
|
162 if self.language: |
|
163 for attr in ('title', 'body'): |
|
164 setattr(self, attr, i18n.get_attribute(attr, self.language, request=self.request)) |
|
165 else: |
|
166 for attr in ('title', 'body'): |
|
167 setattr(self, attr, i18n.query_attribute(attr, request=self.request)) |
|
168 |
|
169 |
|
170 # |
|
171 # Rich text paragraph |
59 # |
172 # |
60 |
173 |
61 @viewlet_config(name='add-html-paragraph.menu', context=IParagraphContainerTarget, view=IParagraphContainerView, |
174 @viewlet_config(name='add-html-paragraph.menu', context=IParagraphContainerTarget, view=IParagraphContainerView, |
62 layer=IPyAMSLayer, manager=IToolbarAddingMenu, weight=50) |
175 layer=IPyAMSLayer, manager=IToolbarAddingMenu, weight=50) |
63 class HTMLParagraphAddMenu(BaseParagraphAddMenu): |
176 class HTMLParagraphAddMenu(BaseParagraphAddMenu): |
64 """HTML paragraph add menu""" |
177 """Rich text paragraph add menu""" |
65 |
178 |
66 label = _("Add HTML paragraph...") |
179 label = _("Add rich text paragraph...") |
67 label_css_class = 'fa fa-fw fa-html5' |
180 label_css_class = 'fa fa-fw fa-html5' |
68 url = 'add-html-paragraph.html' |
181 url = 'add-html-paragraph.html' |
69 paragraph_type = 'HTML' |
182 paragraph_type = 'HTML' |
70 |
183 |
71 |
184 |
72 @pagelet_config(name='add-html-paragraph.html', context=IParagraphContainerTarget, layer=IPyAMSLayer, |
185 @pagelet_config(name='add-html-paragraph.html', context=IParagraphContainerTarget, layer=IPyAMSLayer, |
73 permission=MANAGE_CONTENT_PERMISSION) |
186 permission=MANAGE_CONTENT_PERMISSION) |
74 class HTMLParagraphAddForm(AdminDialogAddForm): |
187 class HTMLParagraphAddForm(AdminDialogAddForm): |
75 """HTML paragraph add form""" |
188 """Rich text paragraph add form""" |
76 |
189 |
77 legend = _("Add new HTML paragraph") |
190 legend = _("Add new rich text paragraph") |
78 dialog_class = 'modal-max' |
191 dialog_class = 'modal-max' |
79 icon_css_class = 'fa fa-fw fa-html5' |
192 icon_css_class = 'fa fa-fw fa-html5' |
80 label_css_class = 'control-label col-md-2' |
193 label_css_class = 'control-label col-md-2' |
81 input_css_class = 'col-md-10' |
194 input_css_class = 'col-md-10' |
82 |
195 |
97 |
210 |
98 |
211 |
99 @view_config(name='add-html-paragraph.json', context=IParagraphContainerTarget, request_type=IPyAMSLayer, |
212 @view_config(name='add-html-paragraph.json', context=IParagraphContainerTarget, request_type=IPyAMSLayer, |
100 permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True) |
213 permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True) |
101 class HTMLParagraphAJAXAddForm(BaseParagraphAJAXAddForm, HTMLParagraphAddForm): |
214 class HTMLParagraphAJAXAddForm(BaseParagraphAJAXAddForm, HTMLParagraphAddForm): |
102 """HTML paragraph add form, JSON renderer""" |
215 """Rich text paragraph add form, JSON renderer""" |
103 |
216 |
104 |
217 |
105 @pagelet_config(name='properties.html', context=IHTMLParagraph, layer=IPyAMSLayer, |
218 @pagelet_config(name='properties.html', context=IHTMLParagraph, layer=IPyAMSLayer, |
106 permission=MANAGE_CONTENT_PERMISSION) |
219 permission=MANAGE_CONTENT_PERMISSION) |
107 class HTMLParagraphPropertiesEditForm(BaseParagraphPropertiesEditForm): |
220 class HTMLParagraphPropertiesEditForm(BaseParagraphPropertiesEditForm): |
108 """HTML paragraph properties edit form""" |
221 """Rich text paragraph properties edit form""" |
109 |
222 |
110 legend = _("Edit HTML paragraph properties") |
223 legend = _("Edit rich text paragraph properties") |
111 dialog_class = 'modal-max' |
224 dialog_class = 'modal-max' |
112 icon_css_class = 'fa fa-fw fa-html5' |
225 icon_css_class = 'fa fa-fw fa-html5' |
113 label_css_class = 'control-label col-md-2' |
226 label_css_class = 'control-label col-md-2' |
114 input_css_class = 'col-md-10' |
227 input_css_class = 'col-md-10' |
115 |
228 |
126 widget.id = '{id}_{name}'.format(id=widget.id, name=self.context.__name__) |
239 widget.id = '{id}_{name}'.format(id=widget.id, name=self.context.__name__) |
127 body_widget.widget_css_class = 'textarea' |
240 body_widget.widget_css_class = 'textarea' |
128 |
241 |
129 |
242 |
130 class IHTMLParagraphInnerEditForm(Interface): |
243 class IHTMLParagraphInnerEditForm(Interface): |
131 """Marker interface for HTML paragraph inner form""" |
244 """Marker interface for rich text paragraph inner form""" |
132 |
245 |
133 |
246 |
134 @view_config(name='properties.json', context=IHTMLParagraph, request_type=IPyAMSLayer, |
247 @view_config(name='properties.json', context=IHTMLParagraph, request_type=IPyAMSLayer, |
135 permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True) |
248 permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True) |
136 class HTMLParagraphPropertiesAJAXEditForm(BaseParagraphAJAXEditForm, HTMLParagraphPropertiesEditForm): |
249 class HTMLParagraphPropertiesAJAXEditForm(BaseParagraphAJAXEditForm, HTMLParagraphPropertiesEditForm): |
137 """HTML paragraph properties edit form, JSON renderer""" |
250 """Rich text paragraph properties edit form, JSON renderer""" |
138 |
251 |
139 def get_ajax_output(self, changes): |
252 def get_ajax_output(self, changes): |
140 output = super(HTMLParagraphPropertiesAJAXEditForm, self).get_ajax_output(changes) |
253 output = super(HTMLParagraphPropertiesAJAXEditForm, self).get_ajax_output(changes) |
141 if 'body' in changes.get(IHTMLParagraph, ()): |
254 if 'body' in changes.get(IHTMLParagraph, ()): |
142 # refresh associations count markers |
255 # refresh associations count markers |