Skip to content

Commit ce43a2f

Browse files
authored
Allow VersionAttribute to operate on items with a version of zero (#869)
1 parent b42c326 commit ce43a2f

File tree

3 files changed

+56
-2
lines changed

3 files changed

+56
-2
lines changed

pynamodb/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -936,7 +936,7 @@ def _handle_version_attribute(self, serialized_attributes, actions=None):
936936
version_attribute = self.get_attributes()[self._version_attribute_name]
937937
version_attribute_value = getattr(self, self._version_attribute_name)
938938

939-
if version_attribute_value:
939+
if version_attribute_value is not None:
940940
version_condition = version_attribute == version_attribute_value
941941
if actions:
942942
actions.append(version_attribute.add(1))

tests/test_model.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3076,6 +3076,60 @@ def test_model_version_attribute_save(self):
30763076

30773077
deep_eq(args, params, _assert=True)
30783078

3079+
def test_model_version_attribute_save_with_initial_version_zero(self):
3080+
self.init_table_meta(VersionedModel, VERSIONED_TABLE_DATA)
3081+
item = VersionedModel('test_user_name', email='test_user@email.com', version=0)
3082+
3083+
with patch(PATCH_METHOD) as req:
3084+
req.return_value = {}
3085+
item.save()
3086+
args = req.call_args[0][1]
3087+
params = {
3088+
'Item': {
3089+
'name': {
3090+
'S': 'test_user_name'
3091+
},
3092+
'email': {
3093+
'S': 'test_user@email.com'
3094+
},
3095+
'version': {
3096+
'N': '1'
3097+
},
3098+
},
3099+
'ReturnConsumedCapacity': 'TOTAL',
3100+
'TableName': 'VersionedModel',
3101+
'ConditionExpression': '#0 = :0',
3102+
'ExpressionAttributeNames': {'#0': 'version'},
3103+
'ExpressionAttributeValues': {':0': {'N': '0'}}
3104+
}
3105+
3106+
deep_eq(args, params, _assert=True)
3107+
item.version = 1
3108+
item.name = "test_new_username"
3109+
item.save()
3110+
args = req.call_args[0][1]
3111+
3112+
params = {
3113+
'Item': {
3114+
'name': {
3115+
'S': 'test_new_username'
3116+
},
3117+
'email': {
3118+
'S': 'test_user@email.com'
3119+
},
3120+
'version': {
3121+
'N': '2'
3122+
},
3123+
},
3124+
'ReturnConsumedCapacity': 'TOTAL',
3125+
'TableName': 'VersionedModel',
3126+
'ConditionExpression': '#0 = :0',
3127+
'ExpressionAttributeNames': {'#0': 'version'},
3128+
'ExpressionAttributeValues': {':0': {'N': '1'}}
3129+
}
3130+
3131+
deep_eq(args, params, _assert=True)
3132+
30793133
def test_version_attribute_increments_on_update(self):
30803134
self.init_table_meta(VersionedModel, VERSIONED_TABLE_DATA)
30813135
item = VersionedModel('test_user_name', email='test_user@email.com')

tox.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[tox]
2-
envlist = py36,py37,pypy,pypy3
2+
envlist = py36,py37,py38,pypy,pypy3
33

44
[testenv]
55
deps = -rrequirements-dev.txt

0 commit comments

Comments
 (0)