Author: novalis
Date: 2008-10-02 15:03:36 -0600 (Thu, 02 Oct 2008)
New Revision: 3614
Modified:
SQLObject/branches/0.10/sqlobject/inheritance/__init__.py
SQLObject/branches/0.10/sqlobject/main.py
SQLObject/branches/0.10/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. (backport to 0.10)
Modified: SQLObject/branches/0.10/sqlobject/inheritance/__init__.py
===================================================================
--- SQLObject/branches/0.10/sqlobject/inheritance/__init__.py 2008-10-02 20:05:22 UTC (rev 3613)
+++ SQLObject/branches/0.10/sqlobject/inheritance/__init__.py 2008-10-02 21:03:36 UTC (rev 3614)
@@ -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
try:
@@ -110,9 +111,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
@@ -224,6 +232,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/branches/0.10/sqlobject/main.py
===================================================================
--- SQLObject/branches/0.10/sqlobject/main.py 2008-10-02 20:05:22 UTC (rev 3613)
+++ SQLObject/branches/0.10/sqlobject/main.py 2008-10-02 21:03:36 UTC (rev 3614)
@@ -1042,8 +1042,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/branches/0.10/sqlobject/versioning/test/test_version.py
===================================================================
--- SQLObject/branches/0.10/sqlobject/versioning/test/test_version.py 2008-10-02 20:05:22 UTC (rev 3613)
+++ SQLObject/branches/0.10/sqlobject/versioning/test/test_version.py 2008-10-02 21:03:36 UTC (rev 3614)
@@ -4,7 +4,6 @@
# For Python 2.3:
from sqlobject.events import sorted
-from py.test import raises
from sqlobject import *
from sqlobject.inheritance import InheritableSQLObject
from sqlobject.versioning import Versioning
@@ -96,6 +95,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"
@@ -107,6 +107,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()
|