diff --git a/README.rst b/README.rst index c68b66d..ce46255 100644 --- a/README.rst +++ b/README.rst @@ -51,7 +51,7 @@ Usage Example doc1 = MyTable(rr, {'animal': 'elephant', 'size': 'large'}) doc1.save() - doc1_copy = MyTable.get(rr, doc1.id) + doc1_copy = MyTable.load(rr, doc1.id) doc1_copy.food = 'bread' doc1_copy.save() diff --git a/doublethink/orm.py b/doublethink/orm.py index a7e9630..d4ec0f9 100644 --- a/doublethink/orm.py +++ b/doublethink/orm.py @@ -273,6 +273,14 @@ class Document(dict, object): ''' return getattr(self, self.pk_field) + def populate_defaults(self): + ''' + This method is called by `save()` before persisting the document to + the database. Subclasses should override it to populate default values + if appropriate. + ''' + pass + def save(self): ''' Persist changes to rethinkdb. Updates only the fields that have @@ -285,6 +293,7 @@ class Document(dict, object): touched. ''' should_insert = False + self.populate_defaults() try: self[self.pk_field] # raises KeyError if missing if self._updates: diff --git a/setup.py b/setup.py index 3a5bfbc..134708f 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ import codecs setuptools.setup( name='doublethink', - version='0.2.0.dev69', + version='0.2.0.dev70', packages=['doublethink'], classifiers=[ 'Programming Language :: Python :: 2.7', diff --git a/tests/test_orm.py b/tests/test_orm.py index 6d43270..c9ec3d7 100644 --- a/tests/test_orm.py +++ b/tests/test_orm.py @@ -279,4 +279,27 @@ def test_orm_pk(rr): assert e['blah'] == 'toot' assert e == e_copy +def test_default_values(rr): + class Person(doublethink.Document): + def populate_defaults(self): + if not "age" in self: + self.age = 0 # born today + + Person.table_ensure(rr) + p = Person(rr, {}) + assert not "age" in p + assert p.age is None + p.save() + assert p.age == 0 + assert p.id + + p.age = 50 + p.save() + + q = Person.load(rr, p.id) + assert q.age == 50 + q.save() + assert q.age == 50 + q.refresh() + assert q.age == 50