__init__.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. '''
  2. This module contains a flask blueprint for db administration stuff
  3. Templates are self-contained in this directory
  4. '''
  5. from __future__ import print_function
  6. from flask import current_app, Blueprint, render_template, jsonify, abort, \
  7. request, redirect, url_for
  8. from larigira.entrypoints_utils import get_avail_entrypoints
  9. from larigira.audiogen import get_audiogenerator
  10. from larigira.timegen import get_timegenerator
  11. from larigira import forms
  12. from .suggestions import get_suggestions
  13. db = Blueprint('db', __name__, url_prefix='/db', template_folder='templates')
  14. def get_model():
  15. return current_app.larigira.controller.monitor.model
  16. @db.route('/')
  17. def home():
  18. return render_template('dbadmin_base.html')
  19. @db.route('/list')
  20. def events_list():
  21. model = current_app.larigira.controller.monitor.model
  22. alarms = tuple(model.get_all_alarms())
  23. events = [(alarm, model.get_actions_by_alarm(alarm))
  24. for alarm in alarms]
  25. return render_template('list.html', events=events)
  26. @db.route('/add/time')
  27. def addtime():
  28. kinds = get_avail_entrypoints('larigira.timeform_create')
  29. def gen_info(gen):
  30. return dict(description=getattr(gen, 'description', ''))
  31. info = {kind: gen_info(get_timegenerator(kind))
  32. for kind in kinds}
  33. return render_template('add_time.html', kinds=kinds, info=info)
  34. @db.route('/edit/time/<int:alarmid>', methods=['GET', 'POST'])
  35. def edit_time(alarmid):
  36. model = get_model()
  37. timespec = model.get_alarm_by_id(alarmid)
  38. kind = timespec['kind']
  39. Form, receiver = tuple(forms.get_timeform(kind))
  40. form = Form()
  41. if request.method == 'GET':
  42. form.populate_from_timespec(timespec)
  43. if request.method == 'POST' and form.validate():
  44. data = receiver(form)
  45. model.update_alarm(alarmid, data)
  46. model.reload()
  47. return redirect(url_for('db.events_list',
  48. _anchor='event-%d' % alarmid))
  49. return render_template('add_time_kind.html',
  50. form=form,
  51. kind=kind,
  52. mode='edit',
  53. )
  54. @db.route('/add/time/<kind>', methods=['GET', 'POST'])
  55. def addtime_kind(kind):
  56. Form, receiver = tuple(forms.get_timeform(kind))
  57. form = Form()
  58. if request.method == 'POST' and form.validate():
  59. data = receiver(form)
  60. eid = get_model().add_alarm(data)
  61. return redirect(url_for('db.edit_event', alarmid=eid))
  62. return render_template('add_time_kind.html',
  63. form=form, kind=kind, mode='add')
  64. @db.route('/add/audio')
  65. def addaudio():
  66. kinds = get_avail_entrypoints('larigira.audioform_create')
  67. def gen_info(gen):
  68. return dict(description=getattr(gen, 'description', ''))
  69. info = {kind: gen_info(get_audiogenerator(kind))
  70. for kind in kinds}
  71. return render_template('add_audio.html', kinds=kinds, info=info)
  72. @db.route('/add/audio/<kind>', methods=['GET', 'POST'])
  73. def addaudio_kind(kind):
  74. Form, receiver = tuple(forms.get_audioform(kind))
  75. form = Form()
  76. if request.method == 'POST' and form.validate():
  77. data = receiver(form)
  78. model = current_app.larigira.controller.monitor.model
  79. eid = model.add_action(data)
  80. return jsonify(dict(inserted=eid, data=data))
  81. return render_template('add_audio_kind.html', form=form, kind=kind,
  82. suggestions=get_suggestions()
  83. )
  84. @db.route('/edit/audio/<int:actionid>', methods=['GET', 'POST'])
  85. def edit_audio(actionid):
  86. model = get_model()
  87. audiospec = model.get_action_by_id(actionid)
  88. kind = audiospec['kind']
  89. Form, receiver = tuple(forms.get_audioform(kind))
  90. form = Form()
  91. if request.method == 'GET':
  92. form.populate_from_audiospec(audiospec)
  93. if request.method == 'POST' and form.validate():
  94. data = receiver(form)
  95. model.update_action(actionid, data)
  96. model.reload()
  97. return redirect(url_for('db.events_list'))
  98. return render_template('add_audio_kind.html',
  99. form=form,
  100. kind=kind,
  101. mode='edit',
  102. suggestions=get_suggestions()
  103. )
  104. @db.route('/edit/event/<alarmid>')
  105. def edit_event(alarmid):
  106. model = current_app.larigira.controller.monitor.model
  107. alarm = model.get_alarm_by_id(int(alarmid))
  108. if alarm is None:
  109. abort(404)
  110. allactions = model.get_all_actions()
  111. print('all', allactions)
  112. actions = tuple(model.get_actions_by_alarm(alarm))
  113. return render_template('edit_event.html',
  114. alarm=alarm, all_actions=allactions,
  115. actions=actions)
  116. @db.route('/api/alarm/<alarmid>/actions', methods=['POST'])
  117. def change_actions(alarmid):
  118. new_actions = request.form.getlist('actions[]')
  119. if new_actions is None:
  120. new_actions = []
  121. model = current_app.larigira.controller.monitor.model
  122. ret = model.update_alarm(int(alarmid),
  123. new_fields={'actions': [int(a) for a in
  124. new_actions]})
  125. return jsonify(dict(updated=alarmid, ret=ret))