From 9a6f0b59ad677a7712abfb3829e0cc8dcb3efa80 Mon Sep 17 00:00:00 2001 From: mdipierro Date: Wed, 2 Jul 2014 18:35:25 -0500 Subject: [PATCH] fixed errors reporting in collection+json --- VERSION | 2 +- gluon/contrib/hypermedia.py | 37 ++++++++++++++++++++++++++----------- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/VERSION b/VERSION index e6407938..3adc1820 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.9.5-trunk+timestamp.2014.07.02.08.25.23 +Version 2.9.5-trunk+timestamp.2014.07.02.18.33.22 diff --git a/gluon/contrib/hypermedia.py b/gluon/contrib/hypermedia.py index a2b5908d..81003877 100644 --- a/gluon/contrib/hypermedia.py +++ b/gluon/contrib/hypermedia.py @@ -67,10 +67,18 @@ class Collection(object): href = URL(args=field._tablename,vars={field.name:row.id},scheme=True) else: href = URL(args=field._tablename,scheme=True)+'?%s={id}' % field.name - links.append({'rel':str(field),'href':href,'prompt':str(field)}) + links.append({'rel':'current','href':href,'prompt':str(field), + 'type':'children'}) + fields = self.table_policy.get('fields', table.fields) + for fieldname in fields: + field = table[fieldname] + if field.type=='upload' and row[fieldname]: + href = URL('download',args=row[fieldname],scheme=True) + links.append({'rel':'current','href':href,'prompt':str(field), + 'type':'attachment'}) # should this be supported? for rel,build in (self.table_policy.get('links',{}).items()): - links.append({'rel':rel,'href':build(row),'prompt':rel}) + links.append({'rel':'current','href':build(row),'prompt':rel}) # not sure return links @@ -257,9 +265,12 @@ class Collection(object): try: (query, limitby, orderby) = self.request2query(table, request.get_vars) fields = filter(lambda (fn,value):table[fn].writable,data.items()) - n = db(query).update(**dict(fields)) # MAY FAIL - response.status = 200 - return '' + res = db(query).validate_and_update(**dict(fields)) # MAY FAIL + if res.errors: + return self.error(400,'BAD REQUEST','Validation Error',res.errors) + else: + response.status = 200 + return '' except: db.rollback() return self.error(400,'BAD REQUEST','Invalid Query') @@ -267,10 +278,14 @@ class Collection(object): # ADD validate fields and return error try: fields = filter(lambda (fn,value):table[fn].writable,data.items()) - id = table.insert(**dict(fields)) # MAY FAIL - response.status = 201 - response.headers['location'] = URL(args=(tablename,id),scheme=True) - return '' + res = table.validate_and_insert(**dict(fields)) # MAY FAIL + if res.errors: + return self.error(400,'BAD REQUEST','Validation Error',res.errors) + else: + response.status = 201 + response.headers['location'] = \ + URL(args=(tablename,res.id),scheme=True) + return '' except SyntaxError,e: #Exception,e: db.rollback() return self.error(400,'BAD REQUEST','Invalid Query:'+e) @@ -287,8 +302,8 @@ class Collection(object): if self.extensions and form_errors: # https://github.com/collection-json/extensions/blob/master/errors.md r['errors'] = errors = {} - for key, value in form_errors: - errors[key] = [{'title':'Validation Error','code':'','message':value}] + for key, value in form_errors.items(): + errors[key] = {'title':'Validation Error','code':'','message':value} response.headers['Content-Type'] = 'application/vnd.collection+json' response.status = 400 return response.json({'collection':r})