@@ -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