Skip to content

Commit

Permalink
Start portlets get implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
rodfersou committed Feb 7, 2019
1 parent 00a35d2 commit 045c695
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/plone/restapi/services/configure.zcml
Expand Up @@ -18,6 +18,7 @@
<include package=".navigation"/>
<include package=".history"/>
<include package=".locking" />
<include package=".portlets"/>
<include package=".principals"/>
<include package=".registry"/>
<include package=".roles"/>
Expand Down
Empty file.
15 changes: 15 additions & 0 deletions src/plone/restapi/services/portlets/configure.zcml
@@ -0,0 +1,15 @@
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:plone="http://namespaces.plone.org/plone">

<adapter factory=".get.Portlets" name="portlets"/>

<plone:service
method="GET"
for="zope.interface.Interface"
factory=".get.PortletsGet"
name="@portlets"
permission="zope2.View"
/>

</configure>
75 changes: 75 additions & 0 deletions src/plone/restapi/services/portlets/get.py
@@ -0,0 +1,75 @@
# -*- coding: utf-8 -*-
from plone.app.portlets.interfaces import IPortletTypeInterface
from plone.portlets.interfaces import IPortletAssignmentMapping
from plone.portlets.interfaces import IPortletAssignmentSettings
from plone.portlets.interfaces import IPortletManager
from plone.restapi.interfaces import IExpandableElement
from plone.restapi.services import Service
from zope.component import adapter
from zope.component import getUtilitiesFor
from zope.component import queryMultiAdapter
from zope.component.hooks import getSite
from zope.interface import implementer
from zope.interface import Interface
from zope.interface import providedBy


@implementer(IExpandableElement)
@adapter(Interface, Interface)
class Portlets(object):

def __init__(self, context, request):
self.context = context
self.request = request
self.portal = getSite()

def __call__(self, expand=False):
result = {
'navigation': {
'@id': '{}/@navigation'.format(self.context.absolute_url()),
},
}
if not expand:
return result

portlets_schemata = {
iface: name
for name, iface in getUtilitiesFor(IPortletTypeInterface)
}
items = {}
for manager_name, manager in getUtilitiesFor(IPortletManager):
mapping = queryMultiAdapter((self.context, manager),
IPortletAssignmentMapping)
if mapping is None:
continue
mapping = mapping.__of__(self.context)
for name, assignment in mapping.items():
type_ = None
schema = None
for schema in providedBy(assignment).flattened():
type_ = portlets_schemata.get(schema, None)
if type_ is not None:
break
if type_ is None:
continue
assignment = assignment.__of__(mapping)
settings = IPortletAssignmentSettings(assignment)
if manager_name not in items:
items[manager_name] = []
items[manager_name].append({
'type': type_,
'visible': settings.get('visible', True),
'assignment': {
name: getattr(assignment, name, None)
for name in schema.names()
},
})
result['portlets']['items'] = items
return result


class PortletsGet(Service):

def reply(self):
portlets = Portlets(self.context, self.request)
return portlets(expand=True)['portlets']

0 comments on commit 045c695

Please sign in to comment.