Skip to content

Commit

Permalink
feat: support for the advance() operation
Browse files Browse the repository at this point in the history
  • Loading branch information
joamag committed Mar 26, 2021
1 parent 9f48f9b commit 74d6499
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 0 deletions.
20 changes: 20 additions & 0 deletions src/quorum/model.py
Expand Up @@ -2377,6 +2377,26 @@ def approve(self, model = None, type = None):
# operation, this may be used for chaining operations
return self

def advance(self, name, delta = 1):
store = self._get_store()
value = store.find_and_modify(
{
"_id" : self._id
},
{
"$inc" : {
name : delta
}
},
new = True
)
value = value or store.find_one({
"_id" : self._id
})
_value = value[name]
setattr(self, name, _value)
return _value

def reload(self, *args, **kwargs):
is_new = self.is_new()
if is_new: exceptions.OperationalError("Can't reload a new model entity")
Expand Down
31 changes: 31 additions & 0 deletions src/quorum/test/model.py
Expand Up @@ -136,6 +136,37 @@ def test_delete(self):
result = mock.Person.count()
self.assertEqual(result, 0)

@quorum.secured
def test_advance(self):
result = mock.Person.count()
self.assertEqual(result, 0)

person = mock.Person()
person.age = 1
person.name = "Name"
person.save()

result = mock.Person.count()
self.assertEqual(result, 1)

person.advance("age")
self.assertEqual(person.age, 2)

person = person.reload()
self.assertEqual(person.age, 2)

person.advance("age", delta = 2)
self.assertEqual(person.age, 4)

person = person.reload()
self.assertEqual(person.age, 4)

person.advance("age", delta = -2)
self.assertEqual(person.age, 2)

person = person.reload()
self.assertEqual(person.age, 2)

@quorum.secured
def test_validation(self):
person = mock.Person()
Expand Down

0 comments on commit 74d6499

Please sign in to comment.