# HG changeset patch # User Aurelien Campeas # Date 1358527055 -3600 # Node ID 5ab6ec83d5ba93a20226cce884b9ac3b28adf2d6 # Parent 9bb93efa1952d0e2e3d60c46b92f8b4661f030c1 [entity,views/json] backout 353bbd17a8b6 (reopens #2559931) Calling .complete() unconditionnally from the json encoder is unsafe since on entity creation validation: * an eid may have been drawn (hence even .has_eid() would not help) while processing form data in the edit controller * a ValidationError may have been raised and the entity-creating transaction rollbacked This leads to a crash on the return path from the validation to the browser, where the json_dumps((status, args, entity)) call will stumble upon the .complete() call which will fail because the entity does not (any more) exist in the database. diff -r 9bb93efa1952 -r 5ab6ec83d5ba entity.py --- a/entity.py Tue Jan 15 20:17:09 2013 +0100 +++ b/entity.py Fri Jan 18 17:37:35 2013 +0100 @@ -539,10 +539,8 @@ """custom json dumps hook to dump the entity's eid which is not part of dict structure itself """ - self.complete() dumpable = self.cw_attr_cache.copy() dumpable['eid'] = self.eid - dumpable['__cwetype__'] = self.__regid__ return dumpable def cw_adapt_to(self, interface): diff -r 9bb93efa1952 -r 5ab6ec83d5ba web/views/json.py --- a/web/views/json.py Tue Jan 15 20:17:09 2013 +0100 +++ b/web/views/json.py Fri Jan 18 17:37:35 2013 +0100 @@ -111,7 +111,12 @@ title = _('json-entities-export-view') def call(self): - if self.cw_rset is None: - self.wdata([self.cw_extra_kwargs.get('entity')]) - else: - self.wdata(list(self.cw_rset.entities())) + entities = [] + for entity in self.cw_rset.entities(): + entity.complete() # fetch all attributes + # hack to add extra metadata + entity.cw_attr_cache.update({ + '__cwetype__': entity.__regid__, + }) + entities.append(entity) + self.wdata(entities)