src/pyams_content/shared/site/container.py
changeset 294 8742c8ac126c
child 492 04503227569d
--- /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)