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 z3c.form import field |
13 from z3c.form import field |
16 from z3c.form.browser.checkbox import SingleCheckBoxFieldWidget |
14 from z3c.form.browser.checkbox import SingleCheckBoxFieldWidget |
17 from zope.interface import implementer |
15 from zope.interface import Interface, implementer |
18 |
16 |
19 from pyams_content import _ |
|
20 from pyams_content.component.association.interfaces import IAssociationContainer |
17 from pyams_content.component.association.interfaces import IAssociationContainer |
21 from pyams_content.component.association.zmi import AssociationItemAJAXAddForm, AssociationItemAJAXEditForm |
18 from pyams_content.component.association.zmi import AssociationItemAJAXAddForm, \ |
|
19 AssociationItemAJAXEditForm |
22 from pyams_content.component.association.zmi.interfaces import IAssociationsView |
20 from pyams_content.component.association.zmi.interfaces import IAssociationsView |
23 from pyams_content.component.links import ExternalLink, InternalLink, MailtoLink |
21 from pyams_content.component.links import ExternalLink, IInternalLinkCustomInfo, InternalLink, \ |
24 from pyams_content.component.links.interfaces import IExternalLink, IInternalLink, ILinkContainerTarget, IMailtoLink |
22 MailtoLink |
|
23 from pyams_content.component.links.interfaces import ICustomInternalLinkTarget, IExternalLink, \ |
|
24 IInternalLink, ILinkContainerTarget, IMailtoLink |
25 from pyams_content.component.paragraph.zmi import get_json_paragraph_markers_refresh_event |
25 from pyams_content.component.paragraph.zmi import get_json_paragraph_markers_refresh_event |
26 from pyams_content.component.paragraph.zmi.container import ParagraphContainerCounterBase |
26 from pyams_content.component.paragraph.zmi.container import ParagraphContainerCounterBase |
27 from pyams_content.component.paragraph.zmi.interfaces import IParagraphContainerTable, IParagraphTitleToolbar |
27 from pyams_content.component.paragraph.zmi.interfaces import IParagraphContainerTable, \ |
|
28 IParagraphTitleToolbar |
28 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION |
29 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION |
29 from pyams_content.reference.pictograms.zmi.widget import PictogramSelectFieldWidget |
30 from pyams_content.reference.pictograms.zmi.widget import PictogramSelectFieldWidget |
30 from pyams_form.form import ajax_config |
31 from pyams_form.form import ajax_config |
|
32 from pyams_form.interfaces.form import IInnerSubForm |
31 from pyams_form.security import ProtectedFormObjectMixin |
33 from pyams_form.security import ProtectedFormObjectMixin |
32 from pyams_pagelet.pagelet import pagelet_config |
34 from pyams_pagelet.pagelet import pagelet_config |
33 from pyams_skin.interfaces.viewlet import IToolbarAddingMenu |
35 from pyams_skin.interfaces.viewlet import IToolbarAddingMenu |
34 from pyams_skin.layer import IPyAMSLayer |
36 from pyams_skin.layer import IPyAMSLayer |
35 from pyams_skin.viewlet.toolbar import ToolbarMenuItem |
37 from pyams_skin.viewlet.toolbar import ToolbarMenuItem |
|
38 from pyams_utils.adapter import adapter_config |
36 from pyams_utils.interfaces import VIEW_SYSTEM_PERMISSION |
39 from pyams_utils.interfaces import VIEW_SYSTEM_PERMISSION |
37 from pyams_viewlet.viewlet import viewlet_config |
40 from pyams_viewlet.viewlet import viewlet_config |
38 from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm |
41 from pyams_zmi.form import AdminDialogAddForm, AdminDialogEditForm, InnerAdminEditForm |
39 from pyams_zmi.interfaces import IPropertiesEditForm |
42 from pyams_zmi.interfaces import IPropertiesEditForm |
40 |
43 |
41 |
44 |
|
45 __docformat__ = 'restructuredtext' |
|
46 |
|
47 from pyams_content import _ |
|
48 |
|
49 |
42 # |
50 # |
43 # Internal links views |
51 # Internal links views |
44 # |
52 # |
45 |
53 |
46 @viewlet_config(name='internal-links', context=ILinkContainerTarget, layer=IPyAMSLayer, view=IParagraphContainerTable, |
54 @viewlet_config(name='internal-links', context=ILinkContainerTarget, layer=IPyAMSLayer, |
47 manager=IParagraphTitleToolbar, permission=VIEW_SYSTEM_PERMISSION, weight=10) |
55 view=IParagraphContainerTable, manager=IParagraphTitleToolbar, |
|
56 permission=VIEW_SYSTEM_PERMISSION, weight=10) |
48 class InternalLinksCounter(ParagraphContainerCounterBase): |
57 class InternalLinksCounter(ParagraphContainerCounterBase): |
49 """Internal links count column""" |
58 """Internal links count column""" |
50 |
59 |
51 weight = 10 |
60 weight = 10 |
52 action_class = 'action internal-links nowrap width-40' |
61 action_class = 'action internal-links nowrap width-40' |
59 def count(self): |
68 def count(self): |
60 return len([file for file in IAssociationContainer(self.context).values() |
69 return len([file for file in IAssociationContainer(self.context).values() |
61 if IInternalLink.providedBy(file)]) |
70 if IInternalLink.providedBy(file)]) |
62 |
71 |
63 |
72 |
64 @viewlet_config(name='add-internal-link.menu', context=ILinkContainerTarget, view=IAssociationsView, |
73 @viewlet_config(name='add-internal-link.menu', context=ILinkContainerTarget, |
65 layer=IPyAMSLayer, manager=IToolbarAddingMenu, weight=50) |
74 view=IAssociationsView, layer=IPyAMSLayer, manager=IToolbarAddingMenu, weight=50) |
66 class InternalLinkAddMenu(ProtectedFormObjectMixin, ToolbarMenuItem): |
75 class InternalLinkAddMenu(ProtectedFormObjectMixin, ToolbarMenuItem): |
67 """Internal link add menu""" |
76 """Internal link add menu""" |
68 |
77 |
69 label = _("Add internal link") |
78 label = _("Add internal link") |
70 label_css_class = 'fa fa-fw fa-external-link-square fa-rotate-90' |
79 label_css_class = 'fa fa-fw fa-external-link-square fa-rotate-90' |
97 IAssociationContainer(self.context).append(object) |
107 IAssociationContainer(self.context).append(object) |
98 |
108 |
99 def get_ajax_output(self, changes): |
109 def get_ajax_output(self, changes): |
100 output = super(self.__class__, self).get_ajax_output(changes) |
110 output = super(self.__class__, self).get_ajax_output(changes) |
101 if output: |
111 if output: |
102 output.setdefault('events', []).append(get_json_paragraph_markers_refresh_event(self.context, self.request, |
112 output.setdefault('events', []).append( |
103 self, InternalLinksCounter)) |
113 get_json_paragraph_markers_refresh_event(self.context, self.request, |
|
114 self, InternalLinksCounter)) |
104 return output |
115 return output |
105 |
116 |
106 |
117 |
107 @pagelet_config(name='properties.html', context=IInternalLink, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION) |
118 @pagelet_config(name='properties.html', context=IInternalLink, layer=IPyAMSLayer, |
|
119 permission=VIEW_SYSTEM_PERMISSION) |
108 @ajax_config(name='properties.json', context=IInternalLink, layer=IPyAMSLayer, |
120 @ajax_config(name='properties.json', context=IInternalLink, layer=IPyAMSLayer, |
109 permission=MANAGE_CONTENT_PERMISSION, base=AssociationItemAJAXEditForm) |
121 permission=MANAGE_CONTENT_PERMISSION, base=AssociationItemAJAXEditForm) |
110 @implementer(IPropertiesEditForm) |
122 @implementer(IPropertiesEditForm) |
111 class InternalLinkPropertiesEditForm(AdminDialogEditForm): |
123 class InternalLinkPropertiesEditForm(AdminDialogEditForm): |
112 """Internal link properties edit form""" |
124 """Internal link properties edit form""" |
129 return self.get_associations_table() |
142 return self.get_associations_table() |
130 else: |
143 else: |
131 return super(self.__class__, self).get_ajax_output(changes) |
144 return super(self.__class__, self).get_ajax_output(changes) |
132 |
145 |
133 |
146 |
|
147 @adapter_config(name='custom', |
|
148 context=(ICustomInternalLinkTarget, IPyAMSLayer, InternalLinkPropertiesEditForm), |
|
149 provides=IInnerSubForm) |
|
150 class CustomInternalLinkPropertiesEditForm(InnerAdminEditForm): |
|
151 """Custom internal link properties edit form""" |
|
152 |
|
153 prefix = 'custom_properties.' |
|
154 |
|
155 css_class = 'form-group' |
|
156 padding_class = '' |
|
157 |
|
158 legend = _("Custom target properties") |
|
159 fieldset_class = 'bordered' |
|
160 |
|
161 @property |
|
162 def fields(self): |
|
163 info = IInternalLinkCustomInfo(self.context, None) |
|
164 if info is not None: |
|
165 return field.Fields(info.properties_interface).omit('properties_interface') |
|
166 return field.Fields(Interface) |
|
167 |
|
168 weight = 1 |
|
169 |
|
170 def render(self): |
|
171 if not self.fields: |
|
172 return '' |
|
173 return super(CustomInternalLinkPropertiesEditForm, self).render() |
|
174 |
|
175 |
134 # |
176 # |
135 # External links views |
177 # External links views |
136 # |
178 # |
137 |
179 |
138 @viewlet_config(name='external-links', context=ILinkContainerTarget, layer=IPyAMSLayer, view=IParagraphContainerTable, |
180 @viewlet_config(name='external-links', context=ILinkContainerTarget, layer=IPyAMSLayer, |
139 manager=IParagraphTitleToolbar, permission=VIEW_SYSTEM_PERMISSION, weight=11) |
181 view=IParagraphContainerTable, manager=IParagraphTitleToolbar, |
|
182 permission=VIEW_SYSTEM_PERMISSION, weight=11) |
140 class ExternalLinksCounter(ParagraphContainerCounterBase): |
183 class ExternalLinksCounter(ParagraphContainerCounterBase): |
141 """External links count column""" |
184 """External links count column""" |
142 |
185 |
143 weight = 11 |
186 weight = 11 |
144 action_class = 'action external-links nowrap width-40' |
187 action_class = 'action external-links nowrap width-40' |
151 def count(self): |
194 def count(self): |
152 return len([file for file in IAssociationContainer(self.context).values() |
195 return len([file for file in IAssociationContainer(self.context).values() |
153 if IExternalLink.providedBy(file)]) |
196 if IExternalLink.providedBy(file)]) |
154 |
197 |
155 |
198 |
156 @viewlet_config(name='add-external-link.menu', context=ILinkContainerTarget, view=IAssociationsView, |
199 @viewlet_config(name='add-external-link.menu', context=ILinkContainerTarget, |
157 layer=IPyAMSLayer, manager=IToolbarAddingMenu, weight=51) |
200 view=IAssociationsView, layer=IPyAMSLayer, manager=IToolbarAddingMenu, weight=51) |
158 class ExternalLinkAddMenu(ProtectedFormObjectMixin, ToolbarMenuItem): |
201 class ExternalLinkAddMenu(ProtectedFormObjectMixin, ToolbarMenuItem): |
159 """External link add menu""" |
202 """External link add menu""" |
160 |
203 |
161 label = _("Add external link") |
204 label = _("Add external link") |
162 label_css_class = 'fa fa-fw fa-external-link' |
205 label_css_class = 'fa fa-fw fa-external-link' |
187 IAssociationContainer(self.context).append(object) |
231 IAssociationContainer(self.context).append(object) |
188 |
232 |
189 def get_ajax_output(self, changes): |
233 def get_ajax_output(self, changes): |
190 output = super(self.__class__, self).get_ajax_output(changes) |
234 output = super(self.__class__, self).get_ajax_output(changes) |
191 if output: |
235 if output: |
192 output.setdefault('events', []).append(get_json_paragraph_markers_refresh_event(self.context, self.request, |
236 output.setdefault('events', []).append( |
193 self, ExternalLinksCounter)) |
237 get_json_paragraph_markers_refresh_event(self.context, self.request, |
|
238 self, ExternalLinksCounter)) |
194 return output |
239 return output |
195 |
240 |
196 |
241 |
197 @pagelet_config(name='properties.html', context=IExternalLink, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION) |
242 @pagelet_config(name='properties.html', context=IExternalLink, layer=IPyAMSLayer, |
|
243 permission=VIEW_SYSTEM_PERMISSION) |
198 @ajax_config(name='properties.json', context=IExternalLink, layer=IPyAMSLayer, |
244 @ajax_config(name='properties.json', context=IExternalLink, layer=IPyAMSLayer, |
199 permission=MANAGE_CONTENT_PERMISSION, base=AssociationItemAJAXEditForm) |
245 permission=MANAGE_CONTENT_PERMISSION, base=AssociationItemAJAXEditForm) |
200 @implementer(IPropertiesEditForm) |
246 @implementer(IPropertiesEditForm) |
201 class ExternalLinkPropertiesEditForm(AdminDialogEditForm): |
247 class ExternalLinkPropertiesEditForm(AdminDialogEditForm): |
202 """External link properties edit form""" |
248 """External link properties edit form""" |
275 IAssociationContainer(self.context).append(object) |
324 IAssociationContainer(self.context).append(object) |
276 |
325 |
277 def get_ajax_output(self, changes): |
326 def get_ajax_output(self, changes): |
278 output = super(self.__class__, self).get_ajax_output(changes) |
327 output = super(self.__class__, self).get_ajax_output(changes) |
279 if output: |
328 if output: |
280 output.setdefault('events', []).append(get_json_paragraph_markers_refresh_event(self.context, self.request, |
329 output.setdefault('events', []).append( |
281 self, MailtoLinksCounter)) |
330 get_json_paragraph_markers_refresh_event(self.context, self.request, |
|
331 self, MailtoLinksCounter)) |
282 return output |
332 return output |
283 |
333 |
284 |
334 |
285 @pagelet_config(name='properties.html', context=IMailtoLink, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION) |
335 @pagelet_config(name='properties.html', context=IMailtoLink, layer=IPyAMSLayer, |
|
336 permission=VIEW_SYSTEM_PERMISSION) |
286 @ajax_config(name='properties.json', context=IMailtoLink, layer=IPyAMSLayer, |
337 @ajax_config(name='properties.json', context=IMailtoLink, layer=IPyAMSLayer, |
287 permission=MANAGE_CONTENT_PERMISSION, base=AssociationItemAJAXEditForm) |
338 permission=MANAGE_CONTENT_PERMISSION, base=AssociationItemAJAXEditForm) |
288 @implementer(IPropertiesEditForm) |
339 @implementer(IPropertiesEditForm) |
289 class MailtoLinkPropertiesEditForm(AdminDialogEditForm): |
340 class MailtoLinkPropertiesEditForm(AdminDialogEditForm): |
290 """Mailto link properties edit form""" |
341 """Mailto link properties edit form""" |