summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/attributes.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2005-11-17 05:05:23 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2005-11-17 05:05:23 +0000
commitef328d7e184e00f9bf4f05b9fd6ff95dc14f51d4 (patch)
treeafb243a5cfa16734d1f6c4833d8f7246445541b2 /lib/sqlalchemy/attributes.py
parent0cde2409f33608f8d45def339d2cc52caf5de411 (diff)
downloadsqlalchemy-ef328d7e184e00f9bf4f05b9fd6ff95dc14f51d4.tar.gz
workin out the lazy/eager thing
Diffstat (limited to 'lib/sqlalchemy/attributes.py')
-rw-r--r--lib/sqlalchemy/attributes.py57
1 files changed, 29 insertions, 28 deletions
diff --git a/lib/sqlalchemy/attributes.py b/lib/sqlalchemy/attributes.py
index 35344350b..40c2cc195 100644
--- a/lib/sqlalchemy/attributes.py
+++ b/lib/sqlalchemy/attributes.py
@@ -105,7 +105,7 @@ class ListElement(util.HistoryArraySet):
list_ = []
obj.__dict__[key] = []
- util.HistoryArraySet.__init__(self, list_, **kwargs)
+ util.HistoryArraySet.__init__(self, list_, readonly=kwargs.get('readonly', False))
def gethistory(self, *args, **kwargs):
return self
@@ -181,20 +181,20 @@ class AttributeManager(object):
pass
def value_changed(self, obj, key, value):
+ """subclasses override this method to provide functionality upon an attribute change of value."""
pass
+
def create_prop(self, key, uselist, **kwargs):
return SmartProperty(self).property(key, uselist)
def create_list(self, obj, key, list_, **kwargs):
return ListElement(obj, key, list_, **kwargs)
+ def create_callable(self, obj, key, func, uselist, **kwargs):
+ return CallableProp(self, func, obj, key, uselist, **kwargs)
def get_attribute(self, obj, key, **kwargs):
try:
return self.get_history(obj, key, **kwargs).getattr()
except KeyError:
- pass
- try:
- return obj.__dict__[key]
- except KeyError:
raise AttributeError(key)
def get_list_attribute(self, obj, key, **kwargs):
@@ -207,12 +207,6 @@ class AttributeManager(object):
def delete_attribute(self, obj, key, **kwargs):
self.get_history(obj, key, **kwargs).delattr()
self.value_changed(obj, key, None)
-
- def set_callable(self, obj, key, func, uselist, **kwargs):
- self.attribute_history(obj)[key] = CallableProp(self, func, obj, key, uselist, **kwargs)
-
- def create_callable(self, obj, key, func, uselist, **kwargs):
- return CallableProp(self, func, obj, key, uselist, **kwargs)
def rollback(self, *obj):
for o in obj:
@@ -234,8 +228,13 @@ class AttributeManager(object):
def remove(self, obj):
pass
-
- def get_history(self, obj, key, create_prop = None, passive=False, **kwargs):
+
+ def create_history(self, obj, key, uselist, callable_=None, **kwargs):
+ p = self.create_history_container(obj, key, uselist, callable_=callable_, **kwargs)
+ self.attribute_history(obj)[key] = p
+ return p
+
+ def get_history(self, obj, key, passive=False, **kwargs):
try:
return self.attribute_history(obj)[key].gethistory(passive=passive, **kwargs)
except KeyError, e:
@@ -262,25 +261,27 @@ class AttributeManager(object):
attr = {}
class_._class_managed_attributes = attr
return attr
+
+
+ def create_history_container(self, obj, key, uselist, callable_ = None, **kwargs):
+ if callable_ is not None:
+ return self.create_callable(obj, key, callable_, uselist=uselist, **kwargs)
+ elif not uselist:
+ return PropHistory(obj, key, **kwargs)
+ else:
+ list_ = obj.__dict__.get(key, None)
+ return self.create_list(obj, key, list_, **kwargs)
- def register_attribute(self, class_, key, uselist, create_prop = None, **kwargs):
+ def register_attribute(self, class_, key, uselist, callable_=None, **kwargs):
# create a function, that will create this object attribute when its first called
def createprop(obj):
- if create_prop is not None:
- # create the object attribute as a callable
- # TODO: too much indirection here, figure out cleaner way
- p = self.create_callable(obj, key, create_prop(obj), uselist=uselist, **kwargs)
- self.attribute_history(obj)[key] = p
- return p
- elif not uselist:
- p = PropHistory(obj, key, **kwargs)
- self.attribute_history(obj)[key] = p
- return p
+ if callable_ is not None:
+ func = callable_(obj)
else:
- list_ = obj.__dict__.get(key, None)
- p = self.create_list(obj, key, list_, **kwargs)
- self.attribute_history(obj)[key] = p
- return p
+ func = None
+ p = self.create_history_container(obj, key, uselist, callable_=func, **kwargs)
+ self.attribute_history(obj)[key] = p
+ return p
self.class_managed(class_)[key] = createprop
setattr(class_, key, self.create_prop(key, uselist))