50 lines
1.5 KiB
Python
50 lines
1.5 KiB
Python
# scopes.storage.proxy
|
|
|
|
"""Core classes and helper functions for creating proxy and adapter objects
|
|
in order to store attribute values in a SQL database.
|
|
|
|
This is currently in concept and exploration state.
|
|
"""
|
|
|
|
import transaction
|
|
|
|
_not_found = object()
|
|
|
|
|
|
def loadData(obj):
|
|
print ('getData ***', obj.context.__name__, obj.context.__parent__.__name__)
|
|
return dict(dummy='dummy')
|
|
|
|
|
|
def storeData(obj, data):
|
|
print ('storeData ***', obj.context.__name__, obj.context.__parent__.__name__, data)
|
|
|
|
|
|
class AdapterBase(object):
|
|
|
|
_old_data = None
|
|
_cont = None
|
|
_id = None
|
|
|
|
def __init__(self, context):
|
|
super(AdapterBase, self).__init__(context)
|
|
object.__setattr__(self, '_new_data', {})
|
|
|
|
def __getattr__(self, attr):
|
|
value = self._new_data.get(attr, _not_found)
|
|
if value is _not_found:
|
|
if self._old_data is None:
|
|
object.__setattr__(self, '_old_data', loadData(self))
|
|
value = self._old_data.get(attr, _not_found)
|
|
if value is _not_found:
|
|
return super(AdapterBase, self).__getattr__(attr)
|
|
return value
|
|
|
|
def __setattr__(self, attr, value):
|
|
super(AdapterBase, self).__setattr__(attr, value)
|
|
if attr.startswith('__') or attr in self._adapterAttributes:
|
|
return
|
|
if not self._new_data:
|
|
tr = transaction.manager.get()
|
|
tr.addBeforeCommitHook(storeData, [self, self._new_data], {})
|
|
self._new_data[attr] = value
|