diff --git a/gluon/dal.py b/gluon/dal.py index 7ef6a1da..92a2fb70 100644 --- a/gluon/dal.py +++ b/gluon/dal.py @@ -9153,8 +9153,8 @@ class Table(object): record = self(_key) if not response.errors and record: - row = self._db(self._id ==_key) - response.id = row.update(**fields) + myset = self._db(self._id == record[self._id.name]) + response.id = myset.update(**fields) else: response.id = None return response @@ -9173,6 +9173,34 @@ class Table(object): newid = self.insert(**values) return newid + def validate_and_update_or_insert(self, _key=DEFAULT, **fields): + if _key is DEFAULT or _key == '': + primary_keys = {} + for key, value in fields.iteritems(): + if key in self._primarykey: + primary_keys[key] = value + if primary_keys != {}: + record = self(**primary_keys) + _key = primary_keys + else: + required_keys = {} + for key, value in fields.iteritems(): + if getattr(self, key).required: + required_keys[key] = value + record = self(**required_keys) + _key = required_keys + elif isinstance(_key, dict): + record = self(**_key) + else: + record = self(_key) + + if record: + response = self.validate_and_update(_key, **fields) + response.id = {'id': self(**fields).id} + else: + response = self.validate_and_insert(**fields) + return response + def bulk_insert(self, items): """ here items is a list of dictionaries