@@ 15-39 (lines=25) @@ | ||
12 | _STORE_AFTER_METHODS = set() |
|
13 | ||
14 | ||
15 | def load_before(method): |
|
16 | """Decorator for methods that should load before call.""" |
|
17 | ||
18 | if getattr(method, '_load_before', False): |
|
19 | return method |
|
20 | ||
21 | _LOAD_BEFORE_METHODS.add(method.__name__) |
|
22 | ||
23 | @functools.wraps(method) |
|
24 | def wrapped(self, *args, **kwargs): |
|
25 | """Decorated method.""" |
|
26 | if not _private_call(method, args): |
|
27 | mapper = common.get_mapper(self) |
|
28 | if mapper and mapper.modified: |
|
29 | log.debug("Loading before call: %s", method.__name__) |
|
30 | mapper.load() |
|
31 | if mapper.auto_save_after_load: |
|
32 | mapper.save() |
|
33 | mapper.modified = False |
|
34 | ||
35 | return method(self, *args, **kwargs) |
|
36 | ||
37 | setattr(wrapped, '_load_before', True) |
|
38 | ||
39 | return wrapped |
|
40 | ||
41 | ||
42 | def save_after(method): |
|
@@ 42-65 (lines=24) @@ | ||
39 | return wrapped |
|
40 | ||
41 | ||
42 | def save_after(method): |
|
43 | """Decorator for methods that should save after call.""" |
|
44 | ||
45 | if getattr(method, '_save_after', False): |
|
46 | return method |
|
47 | ||
48 | _STORE_AFTER_METHODS.add(method.__name__) |
|
49 | ||
50 | @functools.wraps(method) |
|
51 | def wrapped(self, *args, **kwargs): |
|
52 | """Decorated method.""" |
|
53 | result = method(self, *args, **kwargs) |
|
54 | ||
55 | if not _private_call(method, args): |
|
56 | mapper = common.get_mapper(self) |
|
57 | if mapper and mapper.auto_save: |
|
58 | log.debug("Saving after call: %s", method.__name__) |
|
59 | mapper.save() |
|
60 | ||
61 | return result |
|
62 | ||
63 | setattr(wrapped, '_save_after', True) |
|
64 | ||
65 | return wrapped |
|
66 | ||
67 | ||
68 | def _private_call(method, args, prefix='_'): |