Skip to content

Commit

Permalink
Re-organize RestAPI structure. Add data table
Browse files Browse the repository at this point in the history
  • Loading branch information
avoinea committed Jun 16, 2021
1 parent 025794f commit e701b1b
Show file tree
Hide file tree
Showing 12 changed files with 167 additions and 61 deletions.
2 changes: 2 additions & 0 deletions eea/app/visualization/restapi/charts/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
""" RestAPI
"""
5 changes: 5 additions & 0 deletions eea/app/visualization/restapi/charts/configure.zcml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:plone="http://namespaces.plone.org/plone">

</configure>
46 changes: 5 additions & 41 deletions eea/app/visualization/restapi/configure.zcml
Original file line number Diff line number Diff line change
@@ -1,41 +1,5 @@
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:plone="http://namespaces.plone.org/plone">

<include package="plone.restapi" />

<plone:service
method="GET"
name="@dataprovenance"
for="Products.CMFCore.interfaces.ISiteRoot"
factory=".get.DataProvenance"
permission="zope2.View"
/>

<plone:service
method="GET"
name="@dataprovenance"
for="Products.CMFCore.interfaces.IContentish"
factory=".get.Get"
permission="zope2.View"
/>

<adapter factory=".get.DataProvenance" name="dataprovenance" />

<plone:service
method="POST"
name="@dataprovenance"
for="Products.CMFCore.interfaces.ISiteRoot"
factory=".post.DataProvenance"
permission="eea.app.visualization.configure"
/>

<plone:service
method="POST"
name="@dataprovenance"
for="Products.CMFCore.interfaces.IContentish"
factory=".post.Post"
permission="eea.app.visualization.configure"
/>

</configure>
<configure xmlns="http://namespaces.zope.org/zope">
<include package="plone.restapi" />
<include package=".charts" />
<include package=".data" />
</configure>
2 changes: 2 additions & 0 deletions eea/app/visualization/restapi/data/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
""" RestAPI
"""
4 changes: 4 additions & 0 deletions eea/app/visualization/restapi/data/configure.zcml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<configure xmlns="http://namespaces.zope.org/zope">
<include package=".table" />
<include package=".provenance" />
</configure>
2 changes: 2 additions & 0 deletions eea/app/visualization/restapi/data/provenance/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
""" RestAPI
"""
45 changes: 45 additions & 0 deletions eea/app/visualization/restapi/data/provenance/configure.zcml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:plone="http://namespaces.plone.org/plone">

<include package="plone.restapi" />

<!-- Data Provenance -->

<plone:service
method="GET"
name="@provenances"
for="Products.CMFCore.interfaces.ISiteRoot"
factory=".get.DataProvenance"
permission="zope2.View"
/>

<plone:service
method="GET"
name="@provenances"
for="Products.CMFCore.interfaces.IContentish"
factory=".get.Get"
permission="zope2.View"
/>

<adapter factory=".get.DataProvenance" name="provenances" />

<!-- TODO: #123935 - Unify IDataProvenance with IMultiDataProvenance
<plone:service
method="POST"
name="@provenances"
for="Products.CMFCore.interfaces.ISiteRoot"
factory=".post.DataProvenance"
permission="eea.app.visualization.configure"
/>
<plone:service
method="POST"
name="@provenances"
for="Products.CMFCore.interfaces.IContentish"
factory=".post.Post"
permission="eea.app.visualization.configure"
/>
-->

</configure>
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
""" RestAPI enpoint @dataprovenance GET
""" RestAPI GET enpoints
"""
from zope.publisher.interfaces import IPublishTraverse
from zope.interface import implementer
Expand All @@ -14,15 +14,15 @@
@implementer(IExpandableElement)
@adapter(Interface, Interface)
class DataProvenance(object):
""" Get dataprovenance
""" Get data provenances
"""
def __init__(self, context, request):
self.context = context
self.request = request

def __call__(self, expand=False):
result = {"dataprovenance": {
"@id": "{}/@dataprovenance".format(self.context.absolute_url()),
result = {"provenances": {
"@id": "{}/@provenances".format(self.context.absolute_url()),
}}

if not expand:
Expand All @@ -31,23 +31,28 @@ def __call__(self, expand=False):
if IPloneSiteRoot.providedBy(self.context):
return result

result['dataprovenance']['provenances'] = []
result['provenances']['items'] = []

# Get IMultiDataProvenance
multi = queryAdapter(self.context, IMultiDataProvenance)
if multi:
provenances = json_compatible(multi.provenances)
result['provenances']['items'].extend(provenances)

source = queryAdapter(self.context, IDataProvenance)
if source:
result['dataprovenance']['provenances'].append({
if (getattr(source, 'link', None) and
getattr(source, 'title', None) and
getattr(source, 'owner', None)):
provenance = {
"title": json_compatible(source.title),
"owner": json_compatible(source.owner),
"link": json_compatible(source.link)
})
}

if hasattr(source, "copyrights"):
result['dataprovenance']['provenances'][0].update({"copyrights": json_compatible(source.copyrights)})
if getattr(source, "copyrights", None):
provenance['copyrights'] = json_compatible(source.copyrights)

# also get IMultiDataProvenance
multi = queryAdapter(self.context, IMultiDataProvenance)
if multi:
provenances = json_compatible(multi.provenances)
result['dataprovenance']['provenances'] += provenances
result['provenances']['items'].append(provenance)
return result


Expand All @@ -58,4 +63,4 @@ class Get(Service):
def reply(self):
"""Reply"""
info = DataProvenance(self.context, self.request)
return info(expand=True)["dataprovenance"]
return info(expand=True)["provenance"]
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
""" RestAPI enpoint @dataprovenance POST
""" RestAPI enpoint POST
"""
from zope.publisher.interfaces import IPublishTraverse
from zope.interface import implementer, alsoProvides
Expand Down Expand Up @@ -29,7 +29,7 @@ def __call__(self, data=[]):
return dict(
error=dict(
type="BadRequest",
message="Tried to set dataprovenance on site root.",
message="Tried to set data provenances on site root.",
)
)

Expand All @@ -51,7 +51,7 @@ def __call__(self, data=[]):
return dict(
error=dict(
type="BadRequest",
message="No provenances provided.",
message="No data provenances provided.",
)
)

Expand Down Expand Up @@ -107,7 +107,7 @@ def __call__(self, data=[]):
multi.provenances = multi_provenances

self.request.response.setStatus(200)
return dict(message="Successfully set dataprovenance")
return dict(message="Successfully set data provenance")


@implementer(IPublishTraverse)
Expand Down
2 changes: 2 additions & 0 deletions eea/app/visualization/restapi/data/table/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
""" RestAPI
"""
23 changes: 23 additions & 0 deletions eea/app/visualization/restapi/data/table/configure.zcml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:plone="http://namespaces.plone.org/plone">

<plone:service
method="GET"
name="@table"
for="Products.CMFCore.interfaces.ISiteRoot"
factory=".get.DataProvenance"
permission="zope2.View"
/>

<plone:service
method="GET"
name="@table"
for="Products.CMFCore.interfaces.IContentish"
factory=".get.Get"
permission="zope2.View"
/>

<adapter factory=".get.DataTable" name="table" />

</configure>
52 changes: 52 additions & 0 deletions eea/app/visualization/restapi/data/table/get.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
""" RestAPI GET enpoints
"""
from zope.publisher.interfaces import IPublishTraverse
from zope.interface import implementer
from zope.interface import Interface
from zope.component import adapter, queryMultiAdapter
from plone.restapi.services import Service
from plone.restapi.serializer.converters import json_compatible
from plone.restapi.interfaces import IExpandableElement
from Products.CMFPlone.interfaces import IPloneSiteRoot


@implementer(IExpandableElement)
@adapter(Interface, Interface)
class DataTable(object):
""" Get data table
"""
def __init__(self, context, request):
self.context = context
self.request = request

def __call__(self, expand=False):
result = {"table": {
"@id": "{}/@table".format(self.context.absolute_url()),
}}

if not expand:
return result

if IPloneSiteRoot.providedBy(self.context):
return result

view = queryMultiAdapter((
self.context, self.request),
name='download.table'
)

if not view:
return result

result['table'].update(json_compatible(view.data))
return result


@implementer(IPublishTraverse)
class Get(Service):
"""GET"""

def reply(self):
"""Reply"""
info = DataTable(self.context, self.request)
return info(expand=True)["table"]

0 comments on commit e701b1b

Please sign in to comment.