Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 
 
 

68 wiersze
2.1 KiB

  1. """
  2. Add, manage, fire triggers (events / observers)
  3. Standard events called by the framework are "save, submit, cancel"
  4. """
  5. import webnotes
  6. def insert_trigger(doctype, docname, event_name, method):
  7. "inserts a new trigger record"
  8. from webnotes.model.doc import Document
  9. d = Document('DocTrigger')
  10. d.doc_type = doctype
  11. d.doc_name = docname
  12. d.event_name = event_name
  13. d.method = method
  14. d.save(1)
  15. def add_trigger(doctype, docname, event_name, method):
  16. """Add a trigger to an event on a doctype, docname. The specified method will be called.
  17. Wild card '*' is allowed in doctype, docname and/or event_name"""
  18. try:
  19. if not trigger_exists(doctype, docname, event_name, method):
  20. insert_trigger(doctype, docname, event_name, method)
  21. except Exception, e:
  22. if e.args[0]==1146:
  23. setup()
  24. insert_trigger(doctype, docname, event_name, method)
  25. else: raise e
  26. def trigger_exists(doctype, docname, event_name, method):
  27. "returns true if trigger exists"
  28. return webnotes.conn.sql("select name from tabDocTrigger where doc_name=%s and doc_type=%s and event_name=%s and method=%s", \
  29. (doctype, docname, event_name, method))
  30. def remove_trigger(doctype, docname, event_name, method):
  31. "Remove a trigger on an event"
  32. webnotes.conn.sql("delete from tabDocTrigger where doc_name=%s and doc_type=%s and event_name=%s and method=%s", \
  33. (doctype, docname, event_name, method))
  34. def fire_event(doc, event_name):
  35. "Fire all triggers on an event and passes the doc to the trigger"
  36. try:
  37. tl = webnotes.conn.sql("""select method from tabDocTrigger
  38. where (doc_type=%s or doc_type='*')
  39. and (doc_name=%s or doc_name='*')
  40. and (event_name=%s or event_name='*')""", (doc.doctype, doc.name, event_name))
  41. except Exception, e:
  42. if e.args[0]==1146:
  43. setup()
  44. tl = []
  45. else: raise e
  46. for t in tl:
  47. module, method = '.'.join(t[0].split('.')[:-1]), t[0].split('.')[-1]
  48. exec 'from %s import %s' % (module, method) in locals()
  49. locals()[method](doc, event_name)
  50. #
  51. # setup
  52. #
  53. def setup():
  54. "creates the DocTrigger table from core"
  55. webnotes.conn.commit()
  56. from webnotes.modules.module_manager import reload_doc
  57. reload_doc('core','doctype','doctrigger')
  58. webnotes.conn.begin()