From abd72f8df03e7aee85ddde7accecbf8f0871548e Mon Sep 17 00:00:00 2001 From: Oscar Rodriguez Date: Wed, 5 Mar 2014 17:44:56 +0100 Subject: [PATCH 1/4] dal.py: Table class: validate_and_update_or_insert method created, and minor changes in validate_and_update --- gluon/dal.py | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) 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 From 0b7f663d4350be763c6706229d8203f65e429621 Mon Sep 17 00:00:00 2001 From: Oscar Rodriguez Date: Wed, 5 Mar 2014 19:46:19 +0100 Subject: [PATCH 2/4] dal.py: Table class: validate_and_update_or_insert method created, and minor changes in validate_and_update --- gluon/dal.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/gluon/dal.py b/gluon/dal.py index 92a2fb70..ba83a02f 100644 --- a/gluon/dal.py +++ b/gluon/dal.py @@ -9153,7 +9153,16 @@ class Table(object): record = self(_key) if not response.errors and record: - myset = self._db(self._id == record[self._id.name]) + if '_id' in self: + myset = self._db(self._id == record[self._id.name]) + else: + query = None + for key, value in _key.iteritems(): + if query is None: + query = getattr(self, key) == value + else: + query = query & (getattr(self, key) == value) + myset = self._db(query) response.id = myset.update(**fields) else: response.id = None From 3a5a34da0abc21c93e520e61cea6dfe3220a513b Mon Sep 17 00:00:00 2001 From: Oscar Rodriguez Date: Thu, 6 Mar 2014 12:06:57 +0100 Subject: [PATCH 3/4] dal.py: Table class: validate_and_update_or_insert method created, and minor changes in validate_and_update --- gluon/dal.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/gluon/dal.py b/gluon/dal.py index ba83a02f..4a41fe10 100644 --- a/gluon/dal.py +++ b/gluon/dal.py @@ -9205,7 +9205,11 @@ class Table(object): if record: response = self.validate_and_update(_key, **fields) - response.id = {'id': self(**fields).id} + # Now primary key must be returned + primary_keys = {} + for key in self._primarykey: + primary_keys[key] = getattr(record, key) + response.id = primary_keys else: response = self.validate_and_insert(**fields) return response From d4d91fd003a305ff2cdd72835e623b6b49926eae Mon Sep 17 00:00:00 2001 From: Oscar Rodriguez Date: Fri, 7 Mar 2014 16:22:09 +0100 Subject: [PATCH 4/4] dal.py: Table class: validate_and_update_or_insert method created --- gluon/dal.py | 1 - 1 file changed, 1 deletion(-) diff --git a/gluon/dal.py b/gluon/dal.py index 4a41fe10..c1e4a3fe 100644 --- a/gluon/dal.py +++ b/gluon/dal.py @@ -9205,7 +9205,6 @@ class Table(object): if record: response = self.validate_and_update(_key, **fields) - # Now primary key must be returned primary_keys = {} for key in self._primarykey: primary_keys[key] = getattr(record, key)