__init__.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  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. import os
  7. from flask import current_app, Blueprint, render_template, jsonify, abort, \
  8. request, redirect, url_for
  9. from larigira.entrypoints_utils import get_avail_entrypoints
  10. from larigira.audiogen import get_audiogenerator
  11. from larigira.timegen import get_timegenerator
  12. from larigira import forms
  13. from larigira.config import get_conf
  14. from larigira.fsutils import scan_dir_audio
  15. db = Blueprint('db', __name__, url_prefix='/db', template_folder='templates')
  16. def get_model():
  17. return current_app.larigira.controller.monitor.model
  18. def get_suggested_files():
  19. if not get_conf()['FILE_PATH_SUGGESTION']:
  20. return []
  21. if current_app.cache.has('dbadmin.get_suggested_files'):
  22. return current_app.cache.get('dbadmin.get_suggested_files')
  23. current_app.logger.debug('get_suggested_files MISS in cache')
  24. files = []
  25. for path in get_conf()['FILE_PATH_SUGGESTION']:
  26. if not os.path.isdir(path):
  27. current_app.logger.warn('Invalid suggestion path: %s' % path)
  28. continue
  29. pathfiles = scan_dir_audio(path)
  30. files.extend(pathfiles)
  31. current_app.logger.debug('Suggested files: %s' % ', '.join(files))
  32. current_app.cache.set('dbadmin.get_suggested_files', files,
  33. timeout=600) # ten minutes
  34. return files
  35. @db.route('/')
  36. def home():
  37. return render_template('dbadmin_base.html')
  38. @db.route('/list')
  39. def list():
  40. model = current_app.larigira.controller.monitor.model
  41. alarms = tuple(model.get_all_alarms())
  42. events = [(alarm, model.get_actions_by_alarm(alarm))
  43. for alarm in alarms]
  44. return render_template('list.html', events=events)
  45. @db.route('/add/time')
  46. def addtime():
  47. kinds = get_avail_entrypoints('larigira.timeform_create')
  48. def gen_info(gen):
  49. return dict(description=getattr(gen, 'description', ''))
  50. info = {kind: gen_info(get_timegenerator(kind))
  51. for kind in kinds}
  52. return render_template('add_time.html', kinds=kinds, info=info)
  53. @db.route('/edit/time/<int:alarmid>', methods=['GET', 'POST'])
  54. def edit_time(alarmid):
  55. model = get_model()
  56. timespec = model.get_alarm_by_id(alarmid)
  57. kind = timespec['kind']
  58. Form, receiver = tuple(forms.get_timeform(kind))
  59. form = Form()
  60. if request.method == 'GET':
  61. form.populate_from_timespec(timespec)
  62. if request.method == 'POST' and form.validate():
  63. data = receiver(form)
  64. model.update_alarm(alarmid, data)
  65. model.reload()
  66. return redirect(url_for('db.list', _anchor='event-%d' % alarmid))
  67. return render_template('add_time_kind.html',
  68. form=form,
  69. kind=kind,
  70. mode='edit',
  71. )
  72. @db.route('/add/time/<kind>', methods=['GET', 'POST'])
  73. def addtime_kind(kind):
  74. Form, receiver = tuple(forms.get_timeform(kind))
  75. form = Form()
  76. if request.method == 'POST' and form.validate():
  77. data = receiver(form)
  78. eid = get_model().add_alarm(data)
  79. return redirect(url_for('db.edit_event', alarmid=eid))
  80. return render_template('add_time_kind.html',
  81. form=form, kind=kind, mode='add')
  82. @db.route('/add/audio')
  83. def addaudio():
  84. kinds = get_avail_entrypoints('larigira.audioform_create')
  85. def gen_info(gen):
  86. return dict(description=getattr(gen, 'description', ''))
  87. info = {kind: gen_info(get_audiogenerator(kind))
  88. for kind in kinds}
  89. return render_template('add_audio.html', kinds=kinds, info=info)
  90. @db.route('/add/audio/<kind>', methods=['GET', 'POST'])
  91. def addaudio_kind(kind):
  92. Form, receiver = tuple(forms.get_audioform(kind))
  93. form = Form()
  94. if request.method == 'POST' and form.validate():
  95. data = receiver(form)
  96. model = current_app.larigira.controller.monitor.model
  97. eid = model.add_action(data)
  98. return jsonify(dict(inserted=eid, data=data))
  99. return render_template('add_audio_kind.html', form=form, kind=kind,
  100. suggested_files=get_suggested_files())
  101. @db.route('/edit/audio/<int:actionid>', methods=['GET', 'POST'])
  102. def edit_audio(actionid):
  103. model = get_model()
  104. audiospec = model.get_action_by_id(actionid)
  105. kind = audiospec['kind']
  106. Form, receiver = tuple(forms.get_audioform(kind))
  107. form = Form()
  108. if request.method == 'GET':
  109. form.populate_from_audiospec(audiospec)
  110. if request.method == 'POST' and form.validate():
  111. data = receiver(form)
  112. model.update_action(actionid, data)
  113. model.reload()
  114. return redirect(url_for('db.list'))
  115. return render_template('add_audio_kind.html',
  116. form=form,
  117. kind=kind,
  118. mode='edit',
  119. suggested_files=get_suggested_files()
  120. )
  121. @db.route('/edit/event/<alarmid>')
  122. def edit_event(alarmid):
  123. model = current_app.larigira.controller.monitor.model
  124. alarm = model.get_alarm_by_id(int(alarmid))
  125. if alarm is None:
  126. abort(404)
  127. allactions = model.get_all_actions()
  128. print('all', allactions)
  129. actions = tuple(model.get_actions_by_alarm(alarm))
  130. return render_template('edit_event.html',
  131. alarm=alarm, all_actions=allactions,
  132. actions=actions)
  133. @db.route('/api/alarm/<alarmid>/actions', methods=['POST'])
  134. def change_actions(alarmid):
  135. new_actions = request.form.getlist('actions[]')
  136. if new_actions is None:
  137. new_actions = []
  138. model = current_app.larigira.controller.monitor.model
  139. ret = model.update_alarm(int(alarmid),
  140. new_fields={'actions': [int(a) for a in
  141. new_actions]})
  142. return jsonify(dict(updated=alarmid, ret=ret))