Oleg Broytmann wrote:
> On Thu, Dec 28, 2006 at 12:13:35PM -0500, David Turner wrote:
>   
>> This patch
>>     
>
>    Which one?
>
> Oleg.
>   
Mako has a thing which checks outgoing email for phrases like this and
warns if there is no attachment.  I believe I shall try to get something
like this set up.

(I attached it, then thunderbird crashed).
Index: sqlobject/inheritance/__init__.py
===================================================================
--- sqlobject/inheritance/__init__.py	(revision 2153)
+++ sqlobject/inheritance/__init__.py	(working copy)
@@ -164,7 +164,22 @@
 
     delJoin = classmethod(delJoin)
 
+    def getAllColumns(sqlmeta):
+        columns = sqlmeta.columns.copy()
+        sm = sqlmeta
+        while sm.parentClass:
+            columns.update(sm.parentClass.sqlmeta.columns)
+            sm = sm.parentClass.sqlmeta
+        return columns
 
+    def asDict(sqlmeta):
+        result = {}
+        for key in sqlmeta.getAllColumns():
+            result[key] = getattr(sqlmeta.instance, key)
+        result['id'] = sqlmeta.instance.id
+        return result
+
+
 class InheritableSQLObject(SQLObject):
 
     sqlmeta = InheritableSQLMeta
Index: sqlobject/versioning/test/test_version.py
===================================================================
--- sqlobject/versioning/test/test_version.py	(revision 0)
+++ sqlobject/versioning/test/test_version.py	(revision 0)
@@ -0,0 +1,97 @@
+from py.test import raises
+from sqlobject import *
+from sqlobject.tests.dbtest import *
+from sqlobject.inheritance import InheritableSQLObject
+from sqlobject.versioning import Versioning
+
+from datetime import datetime
+
+
+def setup():
+    setupClass(MyClass)
+    setupClass(Base)
+    setupClass(Child)
+    setupClass(Government)
+    setupClass(Monarchy)
+    setupClass(VChild)
+
+class MyClass(SQLObject):
+     name = StringCol()
+     versions = Versioning()
+
+class Base(InheritableSQLObject):
+     name = StringCol()
+     versions = Versioning()
+
+class Child(Base):
+     toy = StringCol()
+
+
+class Government(InheritableSQLObject):
+     name = StringCol()
+
+class Monarchy(Government):
+     monarch = StringCol()
+     versions = Versioning()
+
+class VChild(Base):
+    weapon = StringCol()
+    versions = Versioning()
+
+def test_versioning():
+
+    #the simple case
+    setup()
+    mc = MyClass(name='fleem')
+    mc.set(name='morx')
+    assert len(list(mc.versions)) == 1
+    assert mc.versions[0].name == "fleem"
+
+    assert len(list(MyClass.select())) == 1
+
+def test_inheritable_versioning():
+    setup()
+
+    #base versioned, child unversioned
+    base = Base(name='fleem')
+    base.set(name='morx')
+    assert len(list(base.versions)) == 1
+    assert base.versions[0].name == "fleem"
+    assert len(list(Base.select())) == 1
+
+    child = Child(name='child', toy='nintendo')
+    child.set(name='teenager', toy='guitar')
+    assert len(list(child.versions)) == 0
+
+
+    #child versioned, base unversioned
+    government = Government(name='canada')
+    assert not hasattr(government, 'versions')
+
+    monarchy = Monarchy(name='UK', monarch='king george iv')
+    monarchy.set(name='queen elisabeth ii')
+    assert len(list(monarchy.versions)) == 1
+    assert monarchy.versions[0].name == "UK"
+    assert len(list(Monarchy.select())) == 1
+
+    #both parent and child versioned
+    num_base_versions = len(list(base.versions))
+    vchild = VChild(name='kid', weapon='slingshot')
+    vchild.set(name='toon', weapon='dynamite')
+    assert len(list(base.versions)) == num_base_versions
+    assert len(list(vchild.versions)) == 1
+
+def test_restore():
+    setup()
+    base = Base(name='fleem')
+    base.set(name='morx')
+    assert base.name == "morx"
+    base.versions[0].restore()
+    assert base.name == "fleem"
+
+    monarchy = Monarchy(name='USA', monarch='Emperor Norton I')
+    monarchy.set(name='morx')
+    assert monarchy.name == "morx"
+    monarchy.versions[0].restore()
+    assert monarchy.name == "USA"
+    assert monarchy.monarch == "Emperor Norton I"
Index: sqlobject/versioning/__init__.py
===================================================================
--- sqlobject/versioning/__init__.py	(revision 0)
+++ sqlobject/versioning/__init__.py	(revision 0)
@@ -0,0 +1,65 @@
+from sqlobject import *
+from datetime import datetime
+
+class Version(SQLObject):
+    def restore(self):
+        values = self.sqlmeta.asDict()
+        del values['id']
+        del values['masterID']
+        del values['dateArchived']
+        self.masterClass.get(self.masterID).set(**values)
+
+def getColumns(columns, cls):
+    for column, defi in cls.sqlmeta.columnDefinitions.items():
+        columns[column] = defi.__class__()
+        
+    #ascend heirarchy
+    if cls.sqlmeta.parentClass:
+        getColumns(columns, cls.sqlmeta.parentClass)
+
+
+class Versioning(object):
+    def __init__(self):
+        pass
+    def __addtoclass__(self, soClass, name):
+        self.name = name
+        self.soClass = soClass
+        self.versionClass = None
+        events.listen(self.createTable,
+                      soClass, events.CreateTableSignal)
+        events.listen(self.rowUpdate, soClass,
+                      events.RowUpdateSignal)
+
+    def createVersionTable(self, cls, conn):
+        columns = {'dateArchived': DateTimeCol(default=datetime.now), 
+                   'masterID': IntCol(),
+                   'masterClass' : self.soClass,
+                   }
+
+        getColumns (columns, self.soClass)
+
+        self.versionClass = type(self.soClass.__name__+'Versions',
+                                 (Version,),
+                                 columns)
+
+        self.versionClass.createTable(connection=conn)
+
+    def createTable(self, soClass, connection, extra_sql, post_funcs):
+        assert soClass is self.soClass
+        post_funcs.append(self.createVersionTable)
+
+    def rowUpdate(self, instance, kwargs):
+        if instance.childName and instance.childName != self.soClass.__name__:
+            return #if you want your child class versioned, version it.
+
+        values = instance.sqlmeta.asDict()
+        del values['id']
+        values['masterID'] = instance.id
+        self.versionClass(connection=instance._connection, **values)
+
+    def __get__(self, obj, type=None):
+        if type is None:
+            return self
+        return self.versionClass.select(
+            self.versionClass.q.masterID==obj.id, connection=obj._connection)
+
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
sqlobject-discuss mailing list
sqlobject-discuss@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlobject-discuss

Reply via email to