plone.restapi/unify-expired-and-excluded-items-handling: Implement endpoints for locking

Thomas Buchberger <jenkins-z4DKO/[email protected]> Sat, 29 Jul 2017 16:31:48 -0700 (PDT)
Newsgroups gmane.comp.web.zope.plone.cvs
Message-ID <[email protected]>
Repository: plone.restapi
Branch: refs/heads/unify-expired-and-excluded-items-handling
Date: 2017-07-27T10:02:23+02:00
Author: Thomas Buchberger (buchi) <t.buchberger-/8aE7x569Db/[email protected]>
Commit: https://github.com/plone/plone.restapi/commit/f2639ca870ff3f4a52af40569df460cf1105dc91

Implement endpoints for locking

Files changed:
A src/plone/restapi/services/locking/__init__.py
A src/plone/restapi/services/locking/configure.zcml
A src/plone/restapi/services/locking/locking.py
M src/plone/restapi/services/configure.zcml

diff --git a/src/plone/restapi/services/configure.zcml b/src/plone/restapi/services/configure.zcml
index 800995bb..cdce2f5f 100644
--- a/src/plone/restapi/services/configure.zcml
+++ b/src/plone/restapi/services/configure.zcml
@@ -10,6 +10,7 @@
   <include package=".groups"/>
   <include package=".navigation"/>
   <include package=".history"/>
+  <include package=".locking" />
   <include package=".principals"/>
   <include package=".registry"/>
   <include package=".roles"/>
diff --git a/src/plone/restapi/services/locking/__init__.py b/src/plone/restapi/services/locking/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/src/plone/restapi/services/locking/configure.zcml b/src/plone/restapi/services/locking/configure.zcml
new file mode 100644
index 00000000..d3eb4c94
--- /dev/null
+++ b/src/plone/restapi/services/locking/configure.zcml
@@ -0,0 +1,38 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:plone="http://namespaces.plone.org/plone"
+    xmlns:zcml="http://namespaces.zope.org/zcml">
+
+  <plone:service
+    method="POST"
+    name="@lock"
+    for="Products.CMFCore.interfaces.IContentish"
+    factory=".locking.Lock"
+    permission="cmf.ModifyPortalContent"
+    />
+
+  <plone:service
+    method="POST"
+    name="@unlock"
+    for="Products.CMFCore.interfaces.IContentish"
+    factory=".locking.Unlock"
+    permission="cmf.ModifyPortalContent"
+    />
+
+  <plone:service
+    method="POST"
+    name="@refresh-lock"
+    for="Products.CMFCore.interfaces.IContentish"
+    factory=".locking.RefreshLock"
+    permission="cmf.ModifyPortalContent"
+    />
+
+  <plone:service
+    method="GET"
+    name="@lock"
+    for="Products.CMFCore.interfaces.IContentish"
+    factory=".locking.LockInfo"
+    permission="zope2.View"
+    />
+
+</configure>
diff --git a/src/plone/restapi/services/locking/locking.py b/src/plone/restapi/services/locking/locking.py
new file mode 100644
index 00000000..bf9d34a9
--- /dev/null
+++ b/src/plone/restapi/services/locking/locking.py
@@ -0,0 +1,56 @@
+# -*- coding: utf-8 -*-
+from plone.restapi.services import Service
+from plone.locking.interfaces import ILockable
+from plone.locking.interfaces import IRefreshableLockable
+
+
+class Lock(Service):
+    """Lock an object"""
+
+    def reply(self):
+        lockable = IRefreshableLockable(self.context, None)
+        if lockable is not None:
+            lockable.lock()
+        self.request.response.setStatus(204)
+        return super(Lock, self).reply()
+
+
+class Unlock(Service):
+    """Unlock an object"""
+
+    def reply(self):
+        lockable = ILockable(self.context)
+        if lockable.can_safely_unlock():
+            lockable.unlock()
+        self.request.response.setStatus(204)
+        return super(Unlock, self).reply()
+
+
+class RefreshLock(Service):
+    """Refresh the lock of an object"""
+
+    def reply(self):
+        lockable = IRefreshableLockable(self.context, None)
+        if lockable is not None:
+            lockable.refresh_lock()
+        self.request.response.setStatus(204)
+        return super(RefreshLock, self).reply()
+
+
+class LockInfo(Service):
+    """Returns lock information about an object"""
+
+    def reply(self):
+        lockable = ILockable(self.context)
+        if lockable is not None:
+            info = {
+                'locked': lockable.locked(),
+                'stealable': lockable.stealable(),
+            }
+            lock_info = lockable.lock_info()
+            if len(lock_info) > 0:
+                info['creator'] = lock_info[0]['creator']
+                info['time'] = lock_info[0]['time']
+                info['token'] = lock_info[0]['token']
+                info['timeout'] = lock_info[0]['type'].timeout
+            return info



------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot