Author: novalis
Date: 2008-10-02 12:41:27 -0600 (Thu, 02 Oct 2008)
New Revision: 3611
Modified:
SQLObject/trunk/sqlobject/inheritance/__init__.py
SQLObject/trunk/sqlobject/main.py
SQLObject/trunk/sqlobject/versioning/test/test_version.py
Log:
FIXED: previously, row update events were sent differently for o.set(a=...) vs o.a=... in inherited tables. Now events are consistent
Modified: SQLObject/trunk/sqlobject/inheritance/__init__.py
===================================================================
--- SQLObject/trunk/sqlobject/inheritance/__init__.py 2008-10-02 17:23:46 UTC (rev 3610)
+++ SQLObject/trunk/sqlobject/inheritance/__init__.py 2008-10-02 18:41:27 UTC (rev 3611)
@@ -3,6 +3,7 @@
from sqlobject.col import StringCol, ForeignKey
from sqlobject.main import sqlmeta, SQLObject, SelectResults, \
makeProperties, unmakeProperties, getterName, setterName
+from sqlobject import events
import iteration
def tablesUsedSet(obj, db):
@@ -104,9 +105,16 @@
setattr(soClass, getterName(cname), eval(
'lambda self: self._parent.%s' % cname))
if not col.immutable:
- setattr(soClass, setterName(cname), eval(
- 'lambda self, val: setattr(self._parent, %s, val)'
- % repr(cname)))
+ def make_setfunc(cname):
+ def setfunc(self, val):
+ if not self.sqlmeta._creating and not getattr(self.sqlmeta, "row_update_sig_suppress", False):
+ self.sqlmeta.send(events.RowUpdateSignal, self, {cname : val})
+
+ result = setattr(self._parent, cname, val)
+ return setfunc
+
+ setfunc = make_setfunc(cname)
+ setattr(soClass, setterName(cname), setfunc)
if childUpdate:
makeProperties(soClass)
return
@@ -218,6 +226,12 @@
_inheritable = True
SelectResultsClass = InheritableSelectResults
+ def set(self, **kw):
+ if self._parent:
+ SQLObject.set(self, _suppress_set_sig=True, **kw)
+ else:
+ SQLObject.set(self, **kw)
+
def __classinit__(cls, new_attrs):
SQLObject.__classinit__(cls, new_attrs)
# if we are a child class, add sqlbuilder fields from parents
Modified: SQLObject/trunk/sqlobject/main.py
===================================================================
--- SQLObject/trunk/sqlobject/main.py 2008-10-02 17:23:46 UTC (rev 3610)
+++ SQLObject/trunk/sqlobject/main.py 2008-10-02 18:41:27 UTC (rev 3611)
@@ -1043,8 +1043,8 @@
if self.sqlmeta.cacheValues:
setattr(self, instanceName(name), value)
- def set(self, **kw):
- if not self.sqlmeta._creating and not getattr(self.sqlmeta, "row_update_sig_suppress", False):
+ def set(self, _suppress_set_sig=False, **kw):
+ if not self.sqlmeta._creating and not getattr(self.sqlmeta, "row_update_sig_suppress", False) and not _suppress_set_sig:
self.sqlmeta.send(events.RowUpdateSignal, self, kw)
# set() is used to update multiple values at once,
# potentially with one SQL statement if possible.
Modified: SQLObject/trunk/sqlobject/versioning/test/test_version.py
===================================================================
--- SQLObject/trunk/sqlobject/versioning/test/test_version.py 2008-10-02 17:23:46 UTC (rev 3610)
+++ SQLObject/trunk/sqlobject/versioning/test/test_version.py 2008-10-02 18:41:27 UTC (rev 3611)
@@ -1,4 +1,3 @@
-from py.test import raises
from sqlobject import *
from sqlobject.inheritance import InheritableSQLObject
from sqlobject.versioning import Versioning
@@ -90,6 +89,7 @@
assert not hasattr(government, 'versions')
monarchy = Monarchy(name='UK', monarch='king george iv')
+ assert len(list(monarchy.versions)) == 0
monarchy.set(name='queen elisabeth ii')
assert len(list(monarchy.versions)) == 1
assert monarchy.versions[0].name == "UK"
@@ -101,6 +101,8 @@
vchild.set(name='toon', weapon='dynamite')
assert len(list(base.versions)) == num_base_versions
assert len(list(vchild.versions)) == 1
+ vchild.name = "newname" #test setting using setattr directly rather than .set
+ assert len(list(vchild.versions)) == 2
def test_restore():
setup()
|