Author: novalis
Date: 2007-01-04 11:52:37 -0700 (Thu, 04 Jan 2007)
New Revision: 2172
Modified:
SQLObject/trunk/sqlobject/versioning/__init__.py
SQLObject/trunk/sqlobject/versioning/test/test_version.py
Log:
Added nextVersion and getChangedFields to Versioning
Modified: SQLObject/trunk/sqlobject/versioning/__init__.py
===================================================================
--- SQLObject/trunk/sqlobject/versioning/__init__.py 2006-12-29 15:34:08 UTC (rev 2171)
+++ SQLObject/trunk/sqlobject/versioning/__init__.py 2007-01-04 18:52:37 UTC (rev 2172)
@@ -17,10 +17,29 @@
if cls.sqlmeta.parentClass:
getColumns(columns, cls.sqlmeta.parentClass)
+#these two are methods for a versionable object
+def _nextVersion(self):
+ version = self.select(AND(self.q.masterID == self.masterID, self.q.id > self.id), limit=1, orderBy=self.q.id)
+ if version.count():
+ return version[0]
+ else:
+ return self.master
+def _getChangedFields(self):
+ next = self.nextVersion()
+ columns = self.__class__.sqlmeta.columns
+ fields = []
+ for column in columns:
+ if column not in ["dateArchived", "id", "masterID"]:
+ if getattr(self, column) != getattr(next, column):
+ fields.append(column.title())
+
+ return fields
+
class Versioning(object):
def __init__(self):
pass
+
def __addtoclass__(self, soClass, name):
self.name = name
self.soClass = soClass
@@ -31,16 +50,19 @@
events.RowUpdateSignal)
def createVersionTable(self, cls, conn):
- columns = {'dateArchived': DateTimeCol(default=datetime.now),
- 'masterID': IntCol(),
- 'masterClass' : self.soClass,
- }
+ attrs = {'dateArchived': DateTimeCol(default=datetime.now),
+ 'master': ForeignKey(self.soClass.__name__),
+ 'masterClass' : self.soClass,
+ 'nextVersion' : _nextVersion,
+ 'getChangedFields' : _getChangedFields,
+ '_connection' : conn,
+ }
- getColumns (columns, self.soClass)
+ getColumns (attrs, self.soClass)
self.versionClass = type(self.soClass.__name__+'Versions',
(Version,),
- columns)
+ attrs)
self.versionClass.createTable(connection=conn)
Modified: SQLObject/trunk/sqlobject/versioning/test/test_version.py
===================================================================
--- SQLObject/trunk/sqlobject/versioning/test/test_version.py 2006-12-29 15:34:08 UTC (rev 2171)
+++ SQLObject/trunk/sqlobject/versioning/test/test_version.py 2007-01-04 18:52:37 UTC (rev 2172)
@@ -21,6 +21,7 @@
class Base(InheritableSQLObject):
name = StringCol()
+ value = IntCol(default=0)
versions = Versioning()
class Child(Base):
@@ -95,3 +96,22 @@
monarchy.versions[0].restore()
assert monarchy.name == "USA"
assert monarchy.monarch == "Emperor Norton I"
+
+def test_next():
+ setup()
+ base = Base(name='first', value=1)
+ base.set(name='second')
+ base.set(name='third', value=2)
+ version = base.versions[0]
+ assert version.nextVersion() == base.versions[1]
+ assert version.nextVersion().nextVersion() == base
+
+def test_get_changed():
+ setup()
+ base = Base(name='first', value=1)
+ base.set(name='second')
+ base.set(name='third', value=2)
+ assert base.versions[0].getChangedFields() == ['Name']
+ assert sorted(base.versions[1].getChangedFields()) == ['Name', 'Value']
+
+
|