Skip to content

Commit ea24c4d

Browse files
committed
Added PATCH an element
committer: Ralf Schlatterbeck <[email protected]>
1 parent 6e49949 commit ea24c4d

File tree

1 file changed

+32
-1
lines changed

1 file changed

+32
-1
lines changed

roundup/rest.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,38 @@ def patch_collection(self, class_name, input):
224224
raise Reject('PATCH a class is not allowed')
225225

226226
def patch_element(self, class_name, item_id, input):
227-
raise NotImplementedError
227+
op = input['op'].value.lower()
228+
class_obj = self.db.getclass(class_name)
229+
230+
props = props_from_args(self.db, class_obj, input.value, item_id)
231+
232+
for prop, value in props.iteritems():
233+
if not self.db.security.hasPermission('Edit', self.db.getuid(),
234+
class_name, prop, item_id):
235+
raise Unauthorised('Permission to edit %s of %s%s denied' %
236+
(prop, class_name, item_id))
237+
if op == 'add':
238+
props[prop] = class_obj.get(item_id, prop) + props[prop]
239+
elif op == 'replace':
240+
pass
241+
elif op == 'remove':
242+
props[prop] = None
243+
else:
244+
raise UsageError('PATCH Operation %s is not allowed' % op)
245+
246+
try:
247+
result = class_obj.set(item_id, **props)
248+
self.db.commit()
249+
except (TypeError, IndexError, ValueError), message:
250+
raise ValueError(message)
251+
252+
result = {
253+
'id': item_id,
254+
'type': class_name,
255+
'link': self.base_path + class_name + item_id,
256+
'attribute': result
257+
}
258+
return 200, result
228259

229260
def options_collection(self, class_name, input):
230261
return 204, ""

0 commit comments

Comments
 (0)