1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 | from elixir.statements import Statement
from sqlalchemy.orm.mapper import MapperExtension
import types
class MapperExtensionProxy(MapperExtension):
def after_delete(self, mapper, connection, instance):
if hasattr(instance, '__after_delete__') : instance.__after_delete__()
def after_insert(self, mapper, connection, instance):
if hasattr(instance, '__after_insert__') : instance.__after_insert__()
def after_update(self, mapper, connection, instance):
if hasattr(instance, '__after_update__') : instance.__after_update__()
def before_delete(self, mapper, connection, instance):
if hasattr(instance, '__before_delete__') : instance.__before_delete__()
def before_insert(self, mapper, connection, instance):
if hasattr(instance, '__before_insert__') : instance.__before_insert__()
def before_update(self, mapper, connection, instance):
if hasattr(instance, '__before_update__') : instance.__before_update__()
ext_proxy = MapperExtensionProxy()
def add_mapper_extension_proxy_method(entity, name, callbacks):
def proxy_method(self):
for callback in callbacks:
getattr(self, callback)()
setattr(entity, '__%s__' %name, proxy_method)
extensions = entity._descriptor.mapper_options.get('extension', [])
if type(extensions) is not types.ListType:
extensions = [extensions]
if ext_proxy not in extensions:
extensions.append(ext_proxy)
entity._descriptor.mapper_options['extension'] = extensions
class BeforeDelete(object):
def __init__(self, entity, *callbacks):
add_mapper_extension_proxy_method(entity, 'before_delete', callbacks)
class BeforeInsert(object):
def __init__(self, entity, *callbacks):
add_mapper_extension_proxy_method(entity, 'before_insert', callbacks)
class BeforeUpdate(object):
def __init__(self, entity, *callbacks):
add_mapper_extension_proxy_method(entity, 'before_update', callbacks)
class BeforeDelete(object):
def __init__(self, entity, *callbacks):
add_mapper_extension_proxy_method(entity, 'before_delete', callbacks)
class BeforeInsert(object):
def __init__(self, entity, *callbacks):
add_mapper_extension_proxy_method(entity, 'before_insert', callbacks)
class BeforeUpdate(object):
def __init__(self, entity, *callbacks):
add_mapper_extension_proxy_method(entity, 'before_update', callbacks)
after_delete = Statement(AfterDelete)
after_insert = Statement(AfterInsert)
after_update = Statement(AfterUpdate)
before_delete = Statement(BeforeDelete)
before_insert = Statement(BeforeInsert)
before_delete = Statement(BeforeDelete)
|