# HG changeset patch # User dirk # Date 1315578164 -7200 # Node ID f0afcd1c56565925d2d95b6c50a56fd565ee39f8 # Parent 91a24f4993188e5af28ecf592db87f864bbb5551 implement a couchdb mapping field that stores a datetime instance as a JSON array diff -r 91a24f499318 -r f0afcd1c5656 backend/couchdb/ListDateTimeField.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/backend/couchdb/ListDateTimeField.py Fri Sep 09 16:22:44 2011 +0200 @@ -0,0 +1,14 @@ + +from couchdb.mapping import Field +from datetime import datetime + +class ListDateTimeField(Field): + def _to_python(self, value): + if isinstance(value, list): + return datetime(*value) + return value + + def _to_json(self, value): + if isinstance(value, datetime): + return [ value.year, value.month, value.day, value.hour, value.minute, value.second ] + return value diff -r 91a24f499318 -r f0afcd1c5656 tests/couchdb/ListDateTimeFieldTests.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/couchdb/ListDateTimeFieldTests.py Fri Sep 09 16:22:44 2011 +0200 @@ -0,0 +1,54 @@ + +from backend.couchdb.ListDateTimeField import ListDateTimeField +from couchdb import Server +from couchdb.mapping import Document, TextField +from datetime import datetime +import unittest + +class ListDateTimeFieldTests(unittest.TestCase): + def testToJsonValid(self): + value = datetime(2011, 9, 7, 15, 21, 0) + result = ListDateTimeField()._to_json(value) + self.assertEqual([2011, 9, 7, 15, 21, 0], result) + + def testToJsonInvalid(self): + value = "this is invalid input" + result = ListDateTimeField()._to_json(value) + self.assertEqual(value, result) + + def testToPythonValid(self): + value = [2011, 9, 7, 15, 21, 0] + result = ListDateTimeField()._to_python(value) + expected = datetime(2011, 9, 7, 15, 21, 0) + self.assertEqual(expected, result) + + def testToPythonInvalid(self): + value = "this is invalid input" + result = ListDateTimeField()._to_python(value) + self.assertEqual(value, result) + + def __testRoundTrip(self): + class Dummy(Document): + title = TextField() + date = ListDateTimeField() + + server = Server() + database = server["hello-world"] + + dummy = Dummy() + dummy.title = "created from unit test" + date = datetime.now().replace(microsecond=0) + dummy.date = date + dummy.store(database) + self.assertNotEqual(None, dummy.id) + + dummy2 = Dummy.load(database, dummy.id) + self.assertNotEqual(None, dummy2) + self.assertFalse(dummy == dummy2) + self.assertEqual(date, dummy2.date) + + del database[dummy.id] + +if __name__ == "__main__": + #import sys;sys.argv = ['', 'Test.testName'] + unittest.main() \ No newline at end of file