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