--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_content/shared/site/container.py Sun Nov 26 09:58:07 2017 +0100
@@ -0,0 +1,84 @@
+#
+# Copyright (c) 2008-2015 Thierry Florac <tflorac AT ulthar.net>
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+
+__docformat__ = 'restructuredtext'
+
+
+# import standard library
+import json
+
+# import interfaces
+from pyams_content.shared.site.interfaces import ISiteContainer, ISiteFolder
+from pyams_i18n.interfaces import II18n
+from zope.intid.interfaces import IIntIds
+
+# import packages
+from pyams_utils.registry import get_utility
+from pyams_utils.request import query_request
+from pyramid.location import lineage
+from zope.interface import implementer
+
+
+@implementer(ISiteContainer)
+class SiteContainerMixin(object):
+ """Site container mixin class"""
+
+ def get_folders_tree(self, selected=None, permission=None):
+
+ request = query_request()
+ intids = get_utility(IIntIds)
+
+ def get_folder_items(parent, input):
+ for folder in parent.values():
+ if ISiteFolder.providedBy(folder):
+ if permission is not None:
+ can_select = request.has_permission(permission, context=folder)
+ else:
+ can_select = True
+ value = {
+ 'id': intids.queryId(folder),
+ 'text': II18n(folder).query_attribute('title', request=request),
+ 'state': {
+ 'expanded': folder in lineage(self),
+ 'selected': folder is selected
+ },
+ 'selectable': can_select
+ }
+ items = get_folder_items(folder, [])
+ if items:
+ value['nodes'] = items
+ input.append(value)
+ return input
+
+ # get child folders
+ items = get_folder_items(self, [])
+
+ # get parents folders
+ container = self
+ while ISiteContainer.providedBy(container):
+ if permission is not None:
+ can_select = request.has_permission(permission, context=container)
+ else:
+ can_select = True
+ items = [{
+ 'id': intids.queryId(container),
+ 'text': II18n(container).query_attribute('title', request=request),
+ 'state': {
+ 'expanded': True,
+ 'selected': container is selected
+ },
+ 'selectable': can_select,
+ 'nodes': items
+ }]
+ container = container.__parent__
+
+ return json.dumps(items)