10 # FOR A PARTICULAR PURPOSE. |
10 # FOR A PARTICULAR PURPOSE. |
11 # |
11 # |
12 |
12 |
13 __docformat__ = 'restructuredtext' |
13 __docformat__ = 'restructuredtext' |
14 |
14 |
15 |
|
16 # import standard library |
|
17 import json |
15 import json |
18 from datetime import datetime |
16 from datetime import datetime |
19 |
17 |
20 from pyramid.exceptions import NotFound |
18 from pyramid.exceptions import NotFound |
21 from pyramid.location import lineage |
19 from pyramid.location import lineage |
25 from z3c.table.interfaces import IColumn, IValues |
23 from z3c.table.interfaces import IColumn, IValues |
26 from zope.interface import implementer |
24 from zope.interface import implementer |
27 from zope.intid.interfaces import IIntIds |
25 from zope.intid.interfaces import IIntIds |
28 from zope.lifecycleevent import ObjectMovedEvent |
26 from zope.lifecycleevent import ObjectMovedEvent |
29 |
27 |
30 from pyams_content import _ |
|
31 # import interfaces |
|
32 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION, MANAGE_SITE_PERMISSION |
28 from pyams_content.interfaces import MANAGE_CONTENT_PERMISSION, MANAGE_SITE_PERMISSION |
33 from pyams_content.shared.common.interfaces import ISharedContent |
29 from pyams_content.shared.common.interfaces import ISharedContent |
34 from pyams_content.shared.common.interfaces.zmi import IDashboardTable |
30 from pyams_content.shared.common.interfaces.zmi import IDashboardTable |
35 from pyams_content.shared.common.zmi.dashboard import SharedToolDashboardOwnerColumn, SharedToolDashboardSequenceColumn, \ |
31 from pyams_content.shared.common.zmi.dashboard import SharedToolDashboardOwnerColumn, SharedToolDashboardSequenceColumn, \ |
36 SharedToolDashboardStatusColumn, SharedToolDashboardStatusDateColumn, SharedToolDashboardStatusPrincipalColumn, \ |
32 SharedToolDashboardStatusColumn, SharedToolDashboardStatusDateColumn, SharedToolDashboardStatusPrincipalColumn, \ |
37 SharedToolDashboardVersionColumn |
33 SharedToolDashboardVersionColumn |
38 # import packages |
|
39 from pyams_content.shared.site import WfSiteTopic |
34 from pyams_content.shared.site import WfSiteTopic |
40 from pyams_content.shared.site.interfaces import IContentLink, ISiteContainer, ISiteManager |
35 from pyams_content.shared.site.interfaces import IBaseSiteItem, IContentLink, ISiteContainer, ISiteManager |
41 from pyams_content.skin import pyams_content |
36 from pyams_content.skin import pyams_content |
42 from pyams_content.skin.zmi.interfaces import ISiteTreeMenu, ISiteTreeTable, IUserAddingsMenuLabel |
37 from pyams_content.skin.zmi.interfaces import ISiteTreeMenu, ISiteTreeTable, IUserAddingsMenuLabel |
43 from pyams_form.form import ajax_config |
38 from pyams_form.form import ajax_config |
44 from pyams_i18n.interfaces import II18n |
39 from pyams_i18n.interfaces import II18n |
45 from pyams_pagelet.pagelet import pagelet_config |
40 from pyams_pagelet.pagelet import pagelet_config |
69 from pyams_zmi.form import AdminDialogEditForm |
64 from pyams_zmi.form import AdminDialogEditForm |
70 from pyams_zmi.interfaces.menu import IPropertiesMenu, ISiteManagementMenu |
65 from pyams_zmi.interfaces.menu import IPropertiesMenu, ISiteManagementMenu |
71 from pyams_zmi.layer import IAdminLayer |
66 from pyams_zmi.layer import IAdminLayer |
72 from pyams_zmi.view import AdminView |
67 from pyams_zmi.view import AdminView |
73 |
68 |
74 |
69 from pyams_content import _ |
75 @adapter_config(context=(ISiteContainer, IAdminLayer), provides=IBreadcrumbItem) |
70 |
|
71 |
|
72 @adapter_config(context=(IBaseSiteItem, IAdminLayer), provides=IBreadcrumbItem) |
76 class SiteContainerBreadcrumbAdapter(BreadcrumbAdminLayerItem): |
73 class SiteContainerBreadcrumbAdapter(BreadcrumbAdminLayerItem): |
77 """Site container breadcrumb adapter""" |
74 """Site container breadcrumb adapter""" |
78 |
75 |
79 @property |
76 @property |
80 def label(self): |
77 def label(self): |
94 |
91 |
95 # |
92 # |
96 # Site container publication views |
93 # Site container publication views |
97 # |
94 # |
98 |
95 |
99 @viewlet_config(name='workflow-publication.menu', context=ISiteContainer, layer=IPyAMSLayer, view=ISiteTreeTable, |
96 @viewlet_config(name='workflow-publication.menu', context=IBaseSiteItem, layer=IPyAMSLayer, view=ISiteTreeTable, |
100 manager=ITableItemColumnActionsMenu, permission=MANAGE_SITE_PERMISSION, weight=210) |
97 manager=ITableItemColumnActionsMenu, permission=MANAGE_SITE_PERMISSION, weight=210) |
101 class SiteContainerTableItemWorkflowPublicationMenu(ToolbarMenuItem): |
98 class SiteContainerTableItemWorkflowPublicationMenu(ToolbarMenuItem): |
102 """Site container tree item workflow publication menu""" |
99 """Site container tree item workflow publication menu""" |
103 |
100 |
104 label = _("Publication dates...") |
101 label = _("Publication dates...") |
106 url = 'workflow-publication.html' |
103 url = 'workflow-publication.html' |
107 modal_target = True |
104 modal_target = True |
108 stop_propagation = True |
105 stop_propagation = True |
109 |
106 |
110 |
107 |
111 @viewlet_config(name='workflow-publication.menu', context=ISiteContainer, layer=IAdminLayer, manager=IPropertiesMenu, |
108 @viewlet_config(name='workflow-publication.menu', context=IBaseSiteItem, layer=IAdminLayer, manager=IPropertiesMenu, |
112 permission=MANAGE_SITE_PERMISSION, weight=210) |
109 permission=MANAGE_SITE_PERMISSION, weight=210) |
113 class SiteContainerWorkflowPublicationMenu(MenuItem): |
110 class SiteContainerWorkflowPublicationMenu(MenuItem): |
114 """Site container workflow publication menu""" |
111 """Site container workflow publication menu""" |
115 |
112 |
116 label = _("Publication dates...") |
113 label = _("Publication dates...") |
117 icon_class = 'fa-eye' |
114 icon_class = 'fa-eye' |
118 url = 'workflow-publication.html' |
115 url = 'workflow-publication.html' |
119 modal_target = True |
116 modal_target = True |
120 |
117 |
121 |
118 |
122 @pagelet_config(name='workflow-publication.html', context=ISiteContainer, layer=IPyAMSLayer, |
119 @pagelet_config(name='workflow-publication.html', context=IBaseSiteItem, layer=IPyAMSLayer, |
123 permission=MANAGE_SITE_PERMISSION) |
120 permission=MANAGE_SITE_PERMISSION) |
124 @ajax_config(name='workflow-publication.json', context=ISiteContainer, layer=IPyAMSLayer) |
121 @ajax_config(name='workflow-publication.json', context=IBaseSiteItem, layer=IPyAMSLayer) |
125 class SiteContainerWorkflowPublicationEditForm(AdminDialogEditForm): |
122 class SiteContainerWorkflowPublicationEditForm(AdminDialogEditForm): |
126 """Site container workflow publication edit form""" |
123 """Site container workflow publication edit form""" |
127 |
124 |
128 prefix = 'site_publication.' |
125 prefix = 'site_publication.' |
129 |
126 |
148 icon_class = 'fa-eye opacity-75' |
145 icon_class = 'fa-eye opacity-75' |
149 else: |
146 else: |
150 icon_class = 'fa-eye-slash text-danger opaque' |
147 icon_class = 'fa-eye-slash text-danger opaque' |
151 value = '<i class="fa fa-fw {icon_class} hint align-base" title="{title}" ' \ |
148 value = '<i class="fa fa-fw {icon_class} hint align-base" title="{title}" ' \ |
152 'data-ams-hint-gravity="e"></i>'.format( |
149 'data-ams-hint-gravity="e"></i>'.format( |
153 icon_class=icon_class, |
150 icon_class=icon_class, |
154 title=self.request.localizer.translate(_("Visible element?"))) |
151 title=self.request.localizer.translate(_("Visible element?"))) |
155 intids = get_utility(IIntIds) |
152 intids = get_utility(IIntIds) |
156 output.setdefault('events', []).append( |
153 output.setdefault('events', []).append( |
157 get_json_table_cell_refresh_event(self.context, self.request, |
154 get_json_table_cell_refresh_event(self.context, self.request, |
158 '{0}::{1}'.format(SiteContainerTreeTable.id, |
155 '{0}::{1}'.format(SiteContainerTreeTable.id, |
159 intids.queryId(self.context)), |
156 intids.queryId(self.context)), |
164 |
161 |
165 # |
162 # |
166 # Site container tree view |
163 # Site container tree view |
167 # |
164 # |
168 |
165 |
169 @viewlet_config(name='site-tree.menu', layer=IAdminLayer, context=ISiteContainer, manager=ISiteManagementMenu, |
166 @viewlet_config(name='site-tree.menu', layer=IAdminLayer, context=IBaseSiteItem, manager=ISiteManagementMenu, |
170 permission=VIEW_SYSTEM_PERMISSION, weight=10) |
167 permission=VIEW_SYSTEM_PERMISSION, weight=10) |
171 @viewletmanager_config(name='site-tree.menu', layer=IAdminLayer, context=ISiteContainer, provides=ISiteTreeMenu) |
168 @viewletmanager_config(name='site-tree.menu', layer=IAdminLayer, context=IBaseSiteItem, provides=ISiteTreeMenu) |
172 @implementer(ISiteTreeMenu) |
169 @implementer(ISiteTreeMenu) |
173 class SiteContainerTreeMenu(MenuItem): |
170 class SiteContainerTreeMenu(MenuItem): |
174 """Site container tree menu""" |
171 """Site container tree menu""" |
175 |
172 |
176 label = _("Site tree") |
173 label = _("Site tree") |
229 'data-ams-tree-node-parent-id': lambda x, col: intids.queryId(x.__parent__) |
226 'data-ams-tree-node-parent-id': lambda x, col: intids.queryId(x.__parent__) |
230 }) |
227 }) |
231 return attributes |
228 return attributes |
232 |
229 |
233 |
230 |
234 @adapter_config(name='sorter', context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=IColumn) |
231 @adapter_config(name='sorter', context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=IColumn) |
235 class SiteContainerTreeSorterColumn(SorterColumn): |
232 class SiteContainerTreeSorterColumn(SorterColumn): |
236 """Site container tree sorter column""" |
233 """Site container tree sorter column""" |
237 |
234 |
238 permission = MANAGE_SITE_PERMISSION |
235 permission = MANAGE_SITE_PERMISSION |
239 |
236 |
242 return super(SiteContainerTreeSorterColumn, self).renderCell(item) |
239 return super(SiteContainerTreeSorterColumn, self).renderCell(item) |
243 else: |
240 else: |
244 return '' |
241 return '' |
245 |
242 |
246 |
243 |
247 @view_config(name='set-site-order.json', context=ISiteContainer, request_type=IPyAMSLayer, |
244 @view_config(name='set-site-order.json', context=IBaseSiteItem, request_type=IPyAMSLayer, |
248 permission=MANAGE_SITE_PERMISSION, renderer='json', xhr=True) |
245 permission=MANAGE_SITE_PERMISSION, renderer='json', xhr=True) |
249 def set_site_order(request): |
246 def set_site_order(request): |
250 """Set site elements order""" |
247 """Set site elements order""" |
251 intids = get_utility(IIntIds) |
248 intids = get_utility(IIntIds) |
252 parent_oid = int(request.params.get('parent')) |
249 parent_oid = int(request.params.get('parent')) |
295 row = table.setUpRow(item) |
292 row = table.setUpRow(item) |
296 result.append(table.renderRow(row).strip()) |
293 result.append(table.renderRow(row).strip()) |
297 return result |
294 return result |
298 |
295 |
299 |
296 |
300 @adapter_config(name='visible', context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=IColumn) |
297 @adapter_config(name='visible', context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=IColumn) |
301 class SiteContainerTreeVisibleColumn(JsActionColumn): |
298 class SiteContainerTreeVisibleColumn(JsActionColumn): |
302 """Site container tree visible column""" |
299 """Site container tree visible column""" |
303 |
300 |
304 cssClasses = {'th': 'action', |
301 cssClasses = {'th': 'action', |
305 'td': 'action'} |
302 'td': 'action'} |
330 icon_class = 'fa-eye opacity-75' |
327 icon_class = 'fa-eye opacity-75' |
331 else: |
328 else: |
332 icon_class = 'fa-eye-slash text-danger opaque' |
329 icon_class = 'fa-eye-slash text-danger opaque' |
333 return '<i class="fa fa-fw {icon_class} hint align-base" title="{title}" ' \ |
330 return '<i class="fa fa-fw {icon_class} hint align-base" title="{title}" ' \ |
334 'data-ams-hint-gravity="e"></i>'.format( |
331 'data-ams-hint-gravity="e"></i>'.format( |
335 icon_class=icon_class, |
332 icon_class=icon_class, |
336 title=self.request.localizer.translate(self.get_icon_hint(item))) |
333 title=self.request.localizer.translate(self.get_icon_hint(item))) |
337 |
334 |
338 def get_icon_hint(self, item): |
335 def get_icon_hint(self, item): |
339 translate = self.request.localizer.translate |
336 translate = self.request.localizer.translate |
340 if IContentLink.providedBy(item) and self.request.has_permission(self.permission, context=item): |
337 if IContentLink.providedBy(item) and self.request.has_permission(self.permission, context=item): |
341 return translate(self.active_icon_hint) |
338 return translate(self.active_icon_hint) |
347 return super(SiteContainerTreeVisibleColumn, self).renderCell(item) |
344 return super(SiteContainerTreeVisibleColumn, self).renderCell(item) |
348 else: |
345 else: |
349 return self.get_icon(item) |
346 return self.get_icon(item) |
350 |
347 |
351 |
348 |
352 @view_config(name='switch-content-visibility.json', context=ISiteContainer, request_type=IPyAMSLayer, |
349 @view_config(name='switch-content-visibility.json', context=IBaseSiteItem, request_type=IPyAMSLayer, |
353 permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True) |
350 permission=MANAGE_CONTENT_PERMISSION, renderer='json', xhr=True) |
354 def switch_content_visibility(request): |
351 def switch_content_visibility(request): |
355 """Switch content link visibility""" |
352 """Switch content link visibility""" |
356 container = ISiteContainer(request.context) |
353 container = ISiteContainer(request.context) |
357 content = container.get(str(request.params.get('object_name'))) |
354 content = container.get(str(request.params.get('object_name'))) |
362 'visible': content.visible, |
359 'visible': content.visible, |
363 'published': IWorkflowPublicationInfo(content.__parent__).is_published() |
360 'published': IWorkflowPublicationInfo(content.__parent__).is_published() |
364 } |
361 } |
365 |
362 |
366 |
363 |
367 @adapter_config(name='name', context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=IColumn) |
364 @adapter_config(name='name', context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=IColumn) |
368 class SiteContainerTreeNameColumn(NameColumn): |
365 class SiteContainerTreeNameColumn(NameColumn): |
369 """Site container tree name column""" |
366 """Site container tree name column""" |
370 |
367 |
371 _header = _("Folders and topics") |
368 _header = _("Folders and topics") |
372 |
369 |
375 ' data-ams-click-handler="MyAMS.tree.switchTree">' \ |
372 ' data-ams-click-handler="MyAMS.tree.switchTree">' \ |
376 ' <span class="small hint" title="{hint}" data-ams-hint-gravity="e">' \ |
373 ' <span class="small hint" title="{hint}" data-ams-hint-gravity="e">' \ |
377 ' <i class="fa fa-fw fa-plus-square-o switch"></i>' \ |
374 ' <i class="fa fa-fw fa-plus-square-o switch"></i>' \ |
378 ' </span> {title}' \ |
375 ' </span> {title}' \ |
379 '</span>'.format( |
376 '</span>'.format( |
380 hint=self.request.localizer.translate(_("Click to open/close all folders")), |
377 hint=self.request.localizer.translate(_("Click to open/close all folders")), |
381 title=super(SiteContainerTreeNameColumn, self).renderHeadCell()) |
378 title=super(SiteContainerTreeNameColumn, self).renderHeadCell()) |
382 |
379 |
383 def renderCell(self, item, name=None): |
380 def renderCell(self, item, name=None): |
384 depth = -3 |
381 depth = -3 |
385 for node in lineage(item): |
382 for node in lineage(item): |
386 depth += 1 |
383 depth += 1 |
390 ' data-ams-click-handler="MyAMS.tree.switchTableNode"' \ |
387 ' data-ams-click-handler="MyAMS.tree.switchTableNode"' \ |
391 ' data-ams-stop-propagation="true">' \ |
388 ' data-ams-stop-propagation="true">' \ |
392 ' <i class="fa fa-fw {switch}"></i>' \ |
389 ' <i class="fa fa-fw {switch}"></i>' \ |
393 ' </span> <span class="title">{title}</span>' \ |
390 ' </span> <span class="title">{title}</span>' \ |
394 '</div>'.format( |
391 '</div>'.format( |
395 padding='<span class="tree-node-padding"></span>' * depth, |
392 padding='<span class="tree-node-padding"></span>' * depth, |
396 hint=self.request.localizer.translate(_("Click to show/hide inner folders")), |
393 hint=self.request.localizer.translate(_("Click to show/hide inner folders")), |
397 switch='fa-{state}-square-o switch'.format( |
394 switch='fa-{state}-square-o switch'.format( |
398 state=self.table.rows_state or ('minus' if item in lineage(self.context) else 'plus')) |
395 state=self.table.rows_state or ('minus' if item in lineage(self.context) else 'plus')) |
399 if ISiteContainer.providedBy(item) else '', |
396 if ISiteContainer.providedBy(item) else '', |
400 title=name or super(SiteContainerTreeNameColumn, self).renderCell(item)) |
397 title=name or super(SiteContainerTreeNameColumn, self).renderCell(item)) |
401 |
398 |
402 |
399 |
403 @adapter_config(name='content-type', context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=IColumn) |
400 @adapter_config(name='content-type', context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=IColumn) |
404 class SiteContainerContentTypeColumn(I18nColumn, GetAttrColumn): |
401 class SiteContainerContentTypeColumn(I18nColumn, GetAttrColumn): |
405 """Site container content type column""" |
402 """Site container content type column""" |
406 |
403 |
407 _header = _("Content") |
404 _header = _("Content") |
408 |
405 |
410 |
407 |
411 def getValue(self, obj): |
408 def getValue(self, obj): |
412 return self.request.localizer.translate(obj.content_name) |
409 return self.request.localizer.translate(obj.content_name) |
413 |
410 |
414 |
411 |
415 @adapter_config(name='sequence', context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=IColumn) |
412 @adapter_config(name='sequence', context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=IColumn) |
416 class SiteContainerTreeSequenceColumn(SharedToolDashboardSequenceColumn): |
413 class SiteContainerTreeSequenceColumn(SharedToolDashboardSequenceColumn): |
417 """Site container tree OID column""" |
414 """Site container tree OID column""" |
418 |
415 |
419 def getValue(self, obj): |
416 def getValue(self, obj): |
420 target = obj.get_target() if IContentLink.providedBy(obj) else obj |
417 target = obj.get_target() if IContentLink.providedBy(obj) else obj |
424 if IContentLink.providedBy(obj): |
421 if IContentLink.providedBy(obj): |
425 result = '» {0}'.format(result) |
422 result = '» {0}'.format(result) |
426 return result |
423 return result |
427 |
424 |
428 |
425 |
429 @adapter_config(name='status', context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=IColumn) |
426 @adapter_config(name='status', context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=IColumn) |
430 class SiteContainerTreeStatusColumn(SharedToolDashboardStatusColumn): |
427 class SiteContainerTreeStatusColumn(SharedToolDashboardStatusColumn): |
431 """Site container tree status column""" |
428 """Site container tree status column""" |
432 |
429 |
433 def getValue(self, obj): |
430 def getValue(self, obj): |
434 target = obj.get_target() if IContentLink.providedBy(obj) else obj |
431 target = obj.get_target() if IContentLink.providedBy(obj) else obj |
438 if IContentLink.providedBy(obj): |
435 if IContentLink.providedBy(obj): |
439 result = '({0})'.format(result) |
436 result = '({0})'.format(result) |
440 return result |
437 return result |
441 |
438 |
442 |
439 |
443 @adapter_config(name='status_date', context=(ISiteContainer, IPyAMSLayer, IDashboardTable), provides=IColumn) |
440 @adapter_config(name='status_date', context=(IBaseSiteItem, IPyAMSLayer, IDashboardTable), provides=IColumn) |
444 class SiteContainerTreeStatusDateColumn(SharedToolDashboardStatusDateColumn): |
441 class SiteContainerTreeStatusDateColumn(SharedToolDashboardStatusDateColumn): |
445 """Site container tree status date column""" |
442 """Site container tree status date column""" |
446 |
443 |
447 def getValue(self, obj): |
444 def getValue(self, obj): |
448 target = obj.get_target() if IContentLink.providedBy(obj) else obj |
445 target = obj.get_target() if IContentLink.providedBy(obj) else obj |
452 if IContentLink.providedBy(obj): |
449 if IContentLink.providedBy(obj): |
453 result = '({0})'.format(result) |
450 result = '({0})'.format(result) |
454 return result |
451 return result |
455 |
452 |
456 |
453 |
457 @adapter_config(name='version', context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=IColumn) |
454 @adapter_config(name='version', context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=IColumn) |
458 class SiteContainerTreeVersionColumn(SharedToolDashboardVersionColumn): |
455 class SiteContainerTreeVersionColumn(SharedToolDashboardVersionColumn): |
459 """Site container tree version column""" |
456 """Site container tree version column""" |
460 |
457 |
461 def getValue(self, obj): |
458 def getValue(self, obj): |
462 target = obj.get_target() if IContentLink.providedBy(obj) else obj |
459 target = obj.get_target() if IContentLink.providedBy(obj) else obj |
466 if IContentLink.providedBy(obj): |
463 if IContentLink.providedBy(obj): |
467 result = '({0})'.format(result) |
464 result = '({0})'.format(result) |
468 return result |
465 return result |
469 |
466 |
470 |
467 |
471 @adapter_config(name='status_principal', context=(ISiteContainer, IPyAMSLayer, IDashboardTable), provides=IColumn) |
468 @adapter_config(name='status_principal', context=(IBaseSiteItem, IPyAMSLayer, IDashboardTable), provides=IColumn) |
472 class SiteContainerTreeStatusPrincipalColumn(SharedToolDashboardStatusPrincipalColumn): |
469 class SiteContainerTreeStatusPrincipalColumn(SharedToolDashboardStatusPrincipalColumn): |
473 """Site container tree status principal column""" |
470 """Site container tree status principal column""" |
474 |
471 |
475 def getValue(self, obj): |
472 def getValue(self, obj): |
476 target = obj.get_target() if IContentLink.providedBy(obj) else obj |
473 target = obj.get_target() if IContentLink.providedBy(obj) else obj |
480 if IContentLink.providedBy(obj): |
477 if IContentLink.providedBy(obj): |
481 result = '({0})'.format(result) |
478 result = '({0})'.format(result) |
482 return result |
479 return result |
483 |
480 |
484 |
481 |
485 @adapter_config(name='owner', context=(ISiteContainer, IPyAMSLayer, IDashboardTable), provides=IColumn) |
482 @adapter_config(name='owner', context=(IBaseSiteItem, IPyAMSLayer, IDashboardTable), provides=IColumn) |
486 class SiteContainerTreeOwnerColumn(SharedToolDashboardOwnerColumn): |
483 class SiteContainerTreeOwnerColumn(SharedToolDashboardOwnerColumn): |
487 """Site container tree owner column""" |
484 """Site container tree owner column""" |
488 |
485 |
489 def getValue(self, obj): |
486 def getValue(self, obj): |
490 target = obj.get_target() if IContentLink.providedBy(obj) else obj |
487 target = obj.get_target() if IContentLink.providedBy(obj) else obj |
494 if IContentLink.providedBy(obj): |
491 if IContentLink.providedBy(obj): |
495 result = '({0})'.format(result) |
492 result = '({0})'.format(result) |
496 return result |
493 return result |
497 |
494 |
498 |
495 |
499 @adapter_config(name='trash', context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=IColumn) |
496 @adapter_config(name='trash', context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=IColumn) |
500 class SiteContainerTreeTrashColumn(TrashColumn): |
497 class SiteContainerTreeTrashColumn(TrashColumn): |
501 """Site container tree trash column""" |
498 """Site container tree trash column""" |
502 |
499 |
503 icon_hint = _("Delete site item") |
500 icon_hint = _("Delete site item") |
504 permission = MANAGE_SITE_PERMISSION |
501 permission = MANAGE_SITE_PERMISSION |
514 def delete_site_item(request): |
511 def delete_site_item(request): |
515 """Delete item from site container""" |
512 """Delete item from site container""" |
516 return delete_container_element(request, ignore_permission=True) |
513 return delete_container_element(request, ignore_permission=True) |
517 |
514 |
518 |
515 |
519 @adapter_config(context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=IValues) |
516 @adapter_config(context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=IValues) |
520 class SiteContainerTreeValuesAdapter(ContextRequestViewAdapter): |
517 class SiteContainerTreeValuesAdapter(ContextRequestViewAdapter): |
521 """Site container tree values adapter""" |
518 """Site container tree values adapter""" |
522 |
519 |
523 @property |
520 @property |
524 def values(self): |
521 def values(self): |
538 if ISiteContainer.providedBy(container): |
535 if ISiteContainer.providedBy(container): |
539 get_values(container, values) |
536 get_values(container, values) |
540 return values |
537 return values |
541 |
538 |
542 |
539 |
543 @pagelet_config(name='site-tree.html', context=ISiteContainer, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION) |
540 @pagelet_config(name='site-tree.html', context=IBaseSiteItem, layer=IPyAMSLayer, permission=VIEW_SYSTEM_PERMISSION) |
544 @implementer(IInnerPage) |
541 @implementer(IInnerPage) |
545 class SiteContainerTreeView(AdminView, ContainerView): |
542 class SiteContainerTreeView(AdminView, ContainerView): |
546 """Site Container tree view""" |
543 """Site Container tree view""" |
547 |
544 |
548 table_class = SiteContainerTreeTable |
545 table_class = SiteContainerTreeTable |
550 def __init__(self, context, request): |
547 def __init__(self, context, request): |
551 super(ContainerView, self).__init__(context, request) |
548 super(ContainerView, self).__init__(context, request) |
552 self.table = SiteContainerTreeTable(context, request, can_sort=ISiteManager.providedBy(context)) |
549 self.table = SiteContainerTreeTable(context, request, can_sort=ISiteManager.providedBy(context)) |
553 |
550 |
554 |
551 |
555 @adapter_config(context=(ISiteContainer, IAdminLayer, ISiteTreeTable), provides=IPageHeader) |
552 @adapter_config(context=(IBaseSiteItem, IAdminLayer, ISiteTreeTable), provides=IPageHeader) |
556 class SiteContainerViewHeaderAdapter(DefaultPageHeaderAdapter): |
553 class SiteContainerViewHeaderAdapter(DefaultPageHeaderAdapter): |
557 """Site container tree view header adapter""" |
554 """Site container tree view header adapter""" |
558 |
555 |
559 icon_class = 'fa fa-fw fa-sitemap' |
556 icon_class = 'fa fa-fw fa-sitemap' |
560 |
557 |
561 |
558 |
562 @view_config(name='get-tree.json', context=ISiteContainer, request_type=IPyAMSLayer, |
559 @view_config(name='get-tree.json', context=IBaseSiteItem, request_type=IPyAMSLayer, |
563 permission=VIEW_SYSTEM_PERMISSION, renderer='json', xhr=True) |
560 permission=VIEW_SYSTEM_PERMISSION, renderer='json', xhr=True) |
564 def get_tree(request): |
561 def get_tree(request): |
565 """Get whole tree""" |
562 """Get whole tree""" |
566 |
563 |
567 def get_tree_values(parent): |
564 def get_tree_values(parent): |
594 row = table.setUpRow(item) |
591 row = table.setUpRow(item) |
595 result.append(table.renderRow(row).strip()) |
592 result.append(table.renderRow(row).strip()) |
596 return result |
593 return result |
597 |
594 |
598 |
595 |
599 @adapter_config(context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=ITableElementName) |
596 @adapter_config(context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=ITableElementName) |
600 class SiteContainerTableElementName(ContextRequestViewAdapter): |
597 class SiteContainerTableElementName(ContextRequestViewAdapter): |
601 """Site container tree table element name""" |
598 """Site container tree table element name""" |
602 |
599 |
603 @property |
600 @property |
604 def name(self): |
601 def name(self): |
605 return II18n(self.context).query_attribute('title', request=self.request) |
602 return II18n(self.context).query_attribute('title', request=self.request) |
606 |
603 |
607 |
604 |
608 @adapter_config(context=(ISiteContainer, IPyAMSLayer, ISiteTreeTable), provides=ITableElementEditor) |
605 @adapter_config(context=(IBaseSiteItem, IPyAMSLayer, ISiteTreeTable), provides=ITableElementEditor) |
609 class SiteContainerTableElementEditor(DefaultElementEditorAdapter): |
606 class SiteContainerTableElementEditor(DefaultElementEditorAdapter): |
610 """Site container tree table element editor""" |
607 """Site container tree table element editor""" |
611 |
608 |
612 view_name = 'admin#site-tree.html' |
609 view_name = 'admin#site-tree.html' |
613 modal_target = False |
610 modal_target = False |