|
- """
- Add, manage, fire triggers (events / observers)
- Standard events called by the framework are "save, submit, cancel"
- """
-
- import webnotes
-
- def insert_trigger(doctype, docname, event_name, method):
- "inserts a new trigger record"
-
- from webnotes.model.doc import Document
- d = Document('DocTrigger')
- d.doc_type = doctype
- d.doc_name = docname
- d.event_name = event_name
- d.method = method
- d.save(1)
-
- def add_trigger(doctype, docname, event_name, method):
- """Add a trigger to an event on a doctype, docname. The specified method will be called.
- Wild card '*' is allowed in doctype, docname and/or event_name"""
-
- try:
- if not trigger_exists(doctype, docname, event_name, method):
- insert_trigger(doctype, docname, event_name, method)
- except Exception, e:
- if e.args[0]==1146:
- setup()
- insert_trigger(doctype, docname, event_name, method)
- else: raise e
-
- def trigger_exists(doctype, docname, event_name, method):
- "returns true if trigger exists"
- return webnotes.conn.sql("select name from tabDocTrigger where doc_name=%s and doc_type=%s and event_name=%s and method=%s", \
- (doctype, docname, event_name, method))
-
- def remove_trigger(doctype, docname, event_name, method):
- "Remove a trigger on an event"
- webnotes.conn.sql("delete from tabDocTrigger where doc_name=%s and doc_type=%s and event_name=%s and method=%s", \
- (doctype, docname, event_name, method))
-
- def fire_event(doc, event_name):
- "Fire all triggers on an event and passes the doc to the trigger"
- try:
- tl = webnotes.conn.sql("""select method from tabDocTrigger
- where (doc_type=%s or doc_type='*')
- and (doc_name=%s or doc_name='*')
- and (event_name=%s or event_name='*')""", (doc.doctype, doc.name, event_name))
- except Exception, e:
- if e.args[0]==1146:
- setup()
- tl = []
- else: raise e
-
- for t in tl:
- module, method = '.'.join(t[0].split('.')[:-1]), t[0].split('.')[-1]
- exec 'from %s import %s' % (module, method) in locals()
- locals()[method](doc, event_name)
- #
- # setup
- #
- def setup():
- "creates the DocTrigger table from core"
- webnotes.conn.commit()
- from webnotes.modules.module_manager import reload_doc
- reload_doc('core','doctype','doctrigger')
- webnotes.conn.begin()
-
|