hook WIP
This commit is contained in:
parent
d073bc6a8d
commit
98d82f06a8
6 changed files with 74 additions and 6 deletions
57
realms/lib/hook.py
Normal file
57
realms/lib/hook.py
Normal file
|
@ -0,0 +1,57 @@
|
|||
from flask.ext.sqlalchemy import DeclarativeMeta
|
||||
|
||||
from functools import wraps
|
||||
|
||||
|
||||
def hook_func(name, fn):
|
||||
@wraps(fn)
|
||||
def wrapper(self, *args, **kwargs):
|
||||
for hook, a, kw in self.__class__._pre_hooks.get(name) or []:
|
||||
hook(*a, **kw)
|
||||
|
||||
rv = fn(self, *args, **kwargs)
|
||||
|
||||
for hook, a, kw in self.__class__._post_hooks.get(name) or []:
|
||||
hook(*a, **kw)
|
||||
|
||||
return rv
|
||||
return wrapper
|
||||
|
||||
|
||||
class HookMixinMeta(type):
|
||||
def __new__(cls, name, bases, attrs):
|
||||
super_new = super(HookMixinMeta, cls).__new__
|
||||
|
||||
for key, value in attrs.items():
|
||||
if callable(value):
|
||||
attrs[key] = hook_func(key, value)
|
||||
|
||||
return super_new(cls, name, bases, attrs)
|
||||
|
||||
|
||||
class HookMixin(object):
|
||||
__metaclass__ = HookMixinMeta
|
||||
|
||||
_pre_hooks = {}
|
||||
_post_hooks = {}
|
||||
|
||||
@classmethod
|
||||
def after(cls, method_name):
|
||||
def outer(f, *args, **kwargs):
|
||||
cls._post_hooks.setdefault(method_name, []).append((f, args, kwargs))
|
||||
return f
|
||||
return outer
|
||||
|
||||
|
||||
@classmethod
|
||||
def before(cls, method_name):
|
||||
def outer(f, *args, **kwargs):
|
||||
cls._pre_hooks.setdefault(method_name, []).append((f, args, kwargs))
|
||||
return f
|
||||
return outer
|
||||
|
||||
|
||||
class HookModelMeta(DeclarativeMeta, HookMixinMeta):
|
||||
pass
|
||||
|
||||
|
|
@ -44,7 +44,6 @@ class Model(db.Model):
|
|||
>>> {u'email': u'john@localhost', u'posts': [{u'id': 1, u'title': u'My First Post'}], u'name': u'John', u'id': 1}
|
||||
"""
|
||||
__abstract__ = True
|
||||
|
||||
# Stores changes made to this model's attributes. Can be retrieved
|
||||
# with model.changes
|
||||
_changes = {}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue