diff roundup/rest.py @ 5578:c2214d0c9df8 REST-rebased

Added PATCH an element committer: Ralf Schlatterbeck <rsc@runtux.com>
author Chau Nguyen <dangchau1991@yahoo.com>
date Wed, 30 Jan 2019 10:26:34 +0100
parents 11e75fbb9edc
children 2814d95cfec2
line wrap: on
line diff
--- a/roundup/rest.py	Wed Jan 30 10:26:34 2019 +0100
+++ b/roundup/rest.py	Wed Jan 30 10:26:34 2019 +0100
@@ -224,7 +224,38 @@
         raise Reject('PATCH a class is not allowed')
 
     def patch_element(self, class_name, item_id, input):
-        raise NotImplementedError
+        op = input['op'].value.lower()
+        class_obj = self.db.getclass(class_name)
+
+        props = props_from_args(self.db, class_obj, input.value, item_id)
+
+        for prop, value in props.iteritems():
+            if not self.db.security.hasPermission('Edit', self.db.getuid(),
+                                                  class_name, prop, item_id):
+                raise Unauthorised('Permission to edit %s of %s%s denied' %
+                                   (prop, class_name, item_id))
+            if op == 'add':
+                props[prop] = class_obj.get(item_id, prop) + props[prop]
+            elif op == 'replace':
+                pass
+            elif op == 'remove':
+                props[prop] = None
+            else:
+                raise UsageError('PATCH Operation %s is not allowed' % op)
+
+        try:
+            result = class_obj.set(item_id, **props)
+            self.db.commit()
+        except (TypeError, IndexError, ValueError), message:
+            raise ValueError(message)
+
+        result = {
+            'id': item_id,
+            'type': class_name,
+            'link': self.base_path + class_name + item_id,
+            'attribute': result
+        }
+        return 200, result
 
     def options_collection(self, class_name, input):
         return 204, ""

Roundup Issue Tracker: http://roundup-tracker.org/